比较 C 中的字符串



我有一个程序,它使用 fgets 和声明为的缓冲区从.txt文件中逐行读取学生姓名和成绩:

char buffer[1024];

现在,文件应该以字符串"end"结尾。

如何告诉 while 循环在buffer == "end"时终止?

我尝试使用strcmp但由于某种原因它出现段错误。

简单地回答你的问题,strcmp 实际上是你正在寻找的函数:

#include <string.h>
if(!strcmp(line, "endn") || !strcmp(line, "endrn"))
    break;

或类似的应该可以解决问题。请注意 strcmp 前面的!,因为如果字符串匹配,strcmp 将返回 0(即 false(。但我想你已经知道了,因为你已经在你的问题中提到了strcmp。

关于段错误问题:您确定传递给 strcmp 的指针都不是 NULL 吗?大多数 C 标准库在这里不做任何错误检查,并且在尝试读取内存时会遇到段错误 *(0) .

我想到的另一个可能的问题是,使用 strcmp 当然只有在您已经将缓冲区拆分为单个字符串数组时才有效。 strtok_r可能最适合此任务(使用起来非常棘手(。

当文件中文本的格式固定时,为什么不只使用格式化的 IO 并使用 !EOF用于循环?

例如:

while(fp!=EOF)
{    fscanf(fp,"%s %s %d",name,grades, &marks);
     printf("Name: %stGrade: %st Marks: %dn",name,grade,marks);
}

这将自动检测文件的末尾,这也将删除文本文件中具有字符串"end"的条件。

char *fgets(char *restrict s, int n, FILE *restrict stream(;

fgets(( 函数应将字节从流读取到 s 指向的数组中,直到读取 n-1 个字节,或者读取 a 并将其传输到 s,或者遇到文件结束条件。然后,字符串以空字节结尾。

因此,当您读取字符串"end"时,缓冲区中的元素应该是{'e','n','d',,'\0'},您可以使用strcmp,如下所示:

size_t len = strlen(buffer);
if (buffer[len - 1] == 'n')
{
    buffer[len - 1] == '';
}
if (strcmp(buffer, "end") == 0)
{
    //end
}

if (strncmp(buffer, "end", 3) == 0)
{
    //end
}

使用 strncmp(buffer, "end", 3) 比较前三个字符以及if(3 == strlen(buffer)以确保 end 不以行开头,应该可以解决问题。

相关内容

  • 没有找到相关文章

最新更新