1

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

char buffer[1024];

现在文件应该在一行上以字符串“end”结尾。

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

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

4

4 回答 4

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可能最适合这项任务(尽管使用起来非常棘手)。

于 2012-05-17T03:25:55.037 回答
0

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.

于 2012-05-17T03:52:57.797 回答
0

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.

于 2012-05-17T03:55:05.117 回答
0

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
}
于 2012-05-17T09:47:21.630 回答