C 代码编译没有错误,但 运行 不正确(命令行参数和指针)

C Code Compiles with No Errors but Doesn't Run Right (command line arguments and pointers)

#include <stdio.h>

int strcompare (char*);
int main (int argc, char *argv[])
{
    int argIndex;
for(argIndex = 1; argIndex <= argc; argIndex++)
{
    strcompare(argv[argIndex]);
    printf("%s has %d letters in it\n", argv[argIndex], strcompare(argv[argIndex]));
}
return 0;
}

int strcompare (char *str)
{
    int index, letterDex = 0;
    for (index = 0; *str != '0'; index++)
    {
        letterDex++;
    }
}

作业是计算一个单词中的字母数,编译时没有出现任何错误,但是当我尝试运行时,它根本不起作用

./cma_length noah bruh conner

当我按下 enter 后什么也没有。

它看起来不像是可以编译的代码。函数 strcompare 应该 return 一个 int 并且在上面的实现中它没有 return 任何东西。我假设有一个 return letterDex;在函数的末尾,但在此处复制代码时丢失了它。

在 strcompare 函数的 for 循环中,您将 *str 与“0”进行比较。我认为现在有两件事是错误的:

  1. 您正在将 *str 与“0”进行比较,但您没有更改指针值。所以你一直在比较第一个字符和'0'。您应该执行 str[index] != '0' 或不使用索引增量指针。

  2. 我认为您想查找“\0”而不是“0”。 '\0' 是表示字符串结尾的空终止符。

您没有看到任何事情发生的原因是您陷入了无限循环。

四个问题:

  • 在您的 strcompare
  • 上缺少 return 声明
  • 你没有更新 char*
  • 的指针
  • 在有 4 个元素的 C 数组中,最后一个元素在索引 3 中,因此在 for 循环条件中,您必须检查 <,而不是 <=
  • *str != '0' 是错误的,您正在检查该字符是否为字符 0,而不是转义字符,即 [=17=] 因此以这种方式检查此字符 *str != '[= 18=]'

完成这些事情后,代码将是这样的:

#include <stdio.h>
int strcompare (char*);
int main (int argc, char *argv[])
{
    int argIndex;
    for(argIndex = 1; argIndex < argc; argIndex++){
        strcompare(argv[argIndex]);
        printf("%s has %d letters in it\n", argv[argIndex], strcompare(argv[argIndex]));
    }
    return 0;
}

int strcompare (char *str){
     int letterDex;
     for (letterDex = 1; *str != '[=10=]'; letterDex++){
         str++;
     }
     return letterDex;
}

而且 index 变量没用,所以我刚刚删除了它