【问题标题】:strcmp crashes when comparing with a malloc array与 malloc 数组比较时 strcmp 崩溃
【发布时间】:2016-02-24 14:00:32
【问题描述】:

strcmp 导致程序崩溃,这是为什么呢? 删除 strcmp 时效果很好,并且使用 strcpy 也会导致崩溃

size_t maxLineLen=1024;
char *line = (char*)malloc(maxLineLen);
while(getline(&line, &maxLineLen,stdin)!= -1){
int h =strlen(line);
for (int i = 0; i < h; i++){
             if(strcmp(line[0], "a") == 0)  {
        printf("a found  %c \n ",line[i]);
            break;
        }

    }

}
return 0;
}

【问题讨论】:

标签: c strcmp


【解决方案1】:

strcmp 函数需要 char * 作为第一个参数,但您传递的是 char。与strcpy 类似。这导致了未定义的行为。

您的编译器应该对此给出警告。

如果您要查看字符串中的给定字符是否为a,您可以这样做:

if (line[i] == 'a')

【讨论】:

  • 那么你能告诉我为什么这也不起作用 if(strcmp(*(line+i), "a") == 0){
  • @MFB 表达式*(line+i)line[i]相同,其类型为char,因此作为strcmp的第一个参数无效。
【解决方案2】:

在您的代码中,line 是指向字符的指针。 strcmp 需要指向要比较的字符的指针,但在这里

if(strcmp(line[0], "a") == 0)
//        ^^^^^^^^

您传递的是字符而不是指向它的指针。

解决方案:

if(strcmp(line, "a") == 0)
// ...

if(line[0] == 'a')
// ...

旁注:there is no need to cast returned value of malloc。但是,您应该检查它是否有错误:

char *line;
line = malloc(maxLineLen);
if (line == NULL)
    perror("oh dear! Go on holidays.\n");

【讨论】:

  • if(strcmp(line[0], 'a') == 0) 也不起作用,但 if (line[i] == 'a') 起作用
  • @MFB if(strcmp(line[0], 'a') == 0) 肯定不行
  • 你能解释一下为什么这也不起作用 if(strcmp(*(line+i), "a") == 0){
  • @MFB strcmp 接受指向 char 的指针,但 *(line+i) 是字符本身,而不是指向 char 的指针,但是如果 *(line+i) == 'a' 为真,则 strcmp ((line+i), "a") == 0 也适用于您的情况。但是你应该使用 first compare 来比较单个字符和 strcmp 来比较多字符串。
【解决方案3】:

strcmp(line[0], ... 是错误的。使用strcmp(line, ...)

你应该#include &lt;string.h&gt;,所以你的编译器会显示一个错误。否则,请始终在启用所有警告的情况下进行编译,并阅读编译器向您显示的警告。

【讨论】:

  • 我想逐个比较
  • @MFB strcmp 正是这样做的。哪里有问题 ?阅读 C 字符串和字符串函数。
  • 谢谢,我会测试一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多