【问题标题】:C Code Compiles with No Errors but Doesn't Run Right (command line arguments and pointers)C 代码编译没有错误但运行不正确(命令行参数和指针)
【发布时间】:2020-03-14 09:52:47
【问题描述】:
#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

当我按下回车键后什么也没有。

【问题讨论】:

  • 你应该从你的编译器中得到至少一个警告。如果您没有打开所有警告。
  • strcompare 返回是什么意思?更重要的是,strcompare 是否返回 anything ?然而它声称它会吗?另外,检查for 条件。你知道这将一直运行直到遇到硬 digit 字符'0',不受其他任何限制,并且由于您在输入中没有提供包含'0' 数字字符的此类字符串,因此您的代码将通过它们的字符串结尾终止符运行并脱离未定义行为的悬崖。你确定你的意思不是要在终结符而不是数字-'0' 上停止吗?
  • 您的代码编译时不会出现gcc -Wall 的错误。我收到warning: control reaches end of non-void function [-Wreturn-type]

标签: c pointers command-line-arguments


【解决方案1】:

四个问题:

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

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

#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 != '\0'; letterDex++){
         str++;
     }
     return letterDex;
}

index 变量也没有用,所以我刚刚删除了它

【讨论】:

    【解决方案2】:

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

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

    1. 您将 *str 与 '0' 进行比较,但不会更改指针值。因此,您一直在将第一个字符与“0”进行比较。您应该执行 str[index] != '0' 或不使用 index 递增指针。

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

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

    【讨论】:

    • 在主函数的forloop中遗漏了导致分段错误的问题
    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多