比较C中的字符串

时间:2012-05-17 02:54:48

标签: c arrays string pointers compare

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

char buffer[1024];

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

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

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

4 个答案:

答案 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
}