我有一个程序,它使用 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 不以行开头,应该可以解决问题。