我有一个程序,它使用 fgets 和声明为的缓冲区从 .txt 文件中逐行读取学生姓名和成绩:
char buffer[1024];
现在文件应该在一行上以字符串“end”结尾。
如何告诉 while 循环何时终止buffer == "end"
?
我尝试使用strcmp
,但由于某种原因它出现了段错误。
为了简单地回答您的问题, strcmp 实际上是您正在寻找的功能:
#include <string.h>
if(!strcmp(line, "end\n") || !strcmp(line, "end\r\n"))
break;
或类似的应该做的伎俩。注意!
strcmp 前面的,因为如果字符串匹配,strcmp 返回 0(即 false)。但是我想您已经知道了,因为您已经在问题中提到了 strcmp 。
关于段错误问题:您确定传递给 strcmp 的指针都不是 NULL 吗?大多数 C 标准库在此处不进行任何错误检查,并且在尝试读取*(0)
.
我想到的另一个可能的问题是,使用 strcmp 当然只有在您已经将缓冲区拆分为单个字符串数组时才有效。strtok_r
可能最适合这项任务(尽管使用起来非常棘手)。
Why not just use formatted IO when the format of the text in the file is fixed and use !EOF for looping?
For example:
while(fp!=EOF)
{ fscanf(fp,"%s %s %d",name,grades, &marks);
printf("Name: %s\tGrade: %s\t Marks: %d\n",name,grade,marks);
}
This would automatically detect the end of file, which would also remove the condition of having a string 'end' in the text file.
Using strncmp(buffer, "end", 3)
to compare the first three characters along with if(3 == strlen(buffer)
to make sure end does not start the line, should solve the problem.
char *fgets(char *restrict s, int n, FILE *restrict 流);
fgets() 函数应从流中读取字节到 s 指向的数组中,直到读取 n-1 个字节,或者读取 a 并将其传输到 s,或者遇到文件结束条件。然后字符串以空字节终止。
因此,当您读取字符串“end”时,缓冲区中的元素应该是 {'e', 'n', 'd', '\n', '\0'},您可以使用 strcmp 如下:
size_t len = strlen(buffer);
if (buffer[len - 1] == '\n')
{
buffer[len - 1] == '\0';
}
if (strcmp(buffer, "end") == 0)
{
//end
}
或者
if (strncmp(buffer, "end", 3) == 0)
{
//end
}