我有一个程序,使用fgets和缓冲区从.txt文件中逐行读取学生姓名和成绩:
char buffer[1024];
现在文件应该在一行上以字符串“end”结束。
如何在buffer == "end"
时告诉while循环终止?
我尝试使用strcmp
,但出于某种原因会出现段错误。
答案 0 :(得分:4)
要简单回答你的问题,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
可能最适合此任务(Altough quite tricky可以使用)。
答案 1 :(得分:0)
为什么不在文件中的文本格式固定时使用格式化的IO并使用!EOF进行循环?
例如:
while(fp!=EOF)
{ fscanf(fp,"%s %s %d",name,grades, &marks);
printf("Name: %s\tGrade: %s\t Marks: %d\n",name,grade,marks);
}
这会自动检测文件的结尾,这也会删除文本文件中包含字符串'end'的条件。
答案 2 :(得分:0)
使用strncmp(buffer, "end", 3)
比较前三个字符和if(3 == strlen(buffer)
以确保结束不启动该行,应解决问题。
答案 3 :(得分:0)
char * fgets(char * restrict s,int n,FILE * restrict stream);
fgets()函数必须从流中读取字节到s指向的数组,直到读取n-1个字节,或者读取a并将其传送到s,或者遇到文件结束条件。然后该字符串以空字节终止。
所以,当你读取字符串&#34;结束&#34;时,缓冲区中的元素应该是{&#39; e&#39;,&#39; n&#39;&#39; d&#39; ;,&#39; \ n&#39;,&#39; \ 0&#39;},您可以按如下方式使用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
}