Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较C语言中的字符串_C_Arrays_String_Pointers_Compare - Fatal编程技术网

比较C语言中的字符串

比较C语言中的字符串,c,arrays,string,pointers,compare,C,Arrays,String,Pointers,Compare,我有一个程序,它使用fgets和一个声明为: char buffer[1024]; 现在,文件应该以字符串“end”结束,并单独在一行上 当buffer==“end”时,如何告诉while循环终止 我尝试使用strcmp,但由于某些原因它会出现故障。简单地回答您的问题,strcmp实际上就是您要寻找的功能: #include <string.h> if(!strcmp(line, "end\n") || !strcmp(line, "end\r\n")) break;

我有一个程序,它使用fgets和一个声明为:

char buffer[1024];
现在,文件应该以字符串“end”结束,并单独在一行上

buffer==“end”
时,如何告诉while循环终止


我尝试使用strcmp,但由于某些原因它会出现故障。

简单地回答您的问题,strcmp实际上就是您要寻找的功能:

#include <string.h>

if(!strcmp(line, "end\n") || !strcmp(line, "end\r\n"))
    break;
#包括
如果(!strcmp(第行,“end\n”)| |!strcmp(第行,“end\r\n”))
打破
或者类似的方法就可以了。注意
在strcmp前面,因为如果字符串匹配,strcmp返回0(即false)。但我想你已经知道了,因为你在问题中已经提到了strcmp

关于segfault问题:您确定传递给strcmp的指针都不是空的吗?大多数C标准库在此不执行任何错误检查,并且在尝试读取
*(0)
处的内存时会遇到SEGFULTS


我脑海中突然出现的另一个可能的问题是,只有当您已经将缓冲区拆分为单个字符串数组时,使用strcmp才能正常工作<代码>strtok_r
可能最适合此任务(尽管可以使用)。

简单地回答您的问题,strcmp实际上是您正在寻找的功能:

#include <string.h>

if(!strcmp(line, "end\n") || !strcmp(line, "end\r\n"))
    break;
#包括
如果(!strcmp(第行,“end\n”)| |!strcmp(第行,“end\r\n”))
打破
或者类似的方法就可以了。注意
在strcmp前面,因为如果字符串匹配,strcmp返回0(即false)。但我想你已经知道了,因为你在问题中已经提到了strcmp

关于segfault问题:您确定传递给strcmp的指针都不是空的吗?大多数C标准库在此不执行任何错误检查,并且在尝试读取
*(0)
处的内存时会遇到SEGFULTS


我脑海中突然出现的另一个可能的问题是,只有当您已经将缓冲区拆分为单个字符串数组时,使用strcmp才能正常工作<代码>strtok_r
可能最适合此任务(尽管可以使用)。

当文件中的文本格式已固定并使用时,为什么不使用格式化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”的条件。

当文件中的文本格式固定并使用时,为什么不使用格式化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”的条件。

使用
strncmp(buffer,“end”,3)
比较前三个字符和
if(3==strlen(buffer)
要确保end不启动行,应该解决问题。

使用
strncmp(buffer,“end”,3)
比较前三个字符以及
如果(3==strlen(buffer)
要确保end不启动行,应该解决问题。

char*fgets(char*restrict s,int n,FILE*restrict stream))

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
}

char*fgets(char*restrict s,int n,FILE*restrict stream)

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
}



strcmp
是正确使用的函数,它必须是其他函数。这是作业吗?我们可以看看你的代码吗?你应该找出为什么
strcmp
会出现故障,而不是避免出现问题。代码非常复杂,因为作业已经完成。只是我不能把“结束”放在后面在文件末尾,因为这将导致segfault。我只需要一种方法来使用“end”作为停止读取的手段,因为到目前为止,我正在使用“fgets(buffer,1024,file)!=NULL”来停止读取。如果您的代码仍然存在segfault,那么您还没有“得到它”.
strcmp
是正确的函数,它必须是其他函数。这是家庭作业吗?我们可以看看你的代码吗?你应该弄清楚为什么
strcmp
segfults而不是避免这个问题。代码非常复杂,因为作业已经完成。只是我不能把“结束”放在后面在文件末尾,因为这将导致segfault。我只需要一种方法来使用“end”作为停止读取的手段,因为到目前为止,我正在使用“fgets(buffer,1024,file)!=NULL”来停止读取。如果您的代码仍然存在segfault,那么您还没有“得到它”。使用
\r
进行第二次测试是不必要的;如果以文本模式阅读,则操作系统特定的行尾将转换为
'\n'
@KeithThompson:我认为这是不安全的。在任何POSIX系统上,使用C标准库(
fopen
)打开文件的方法只有一种标准中明确指出,
r
rb
是相同的模式。是的,因为POSIX文本文件只使用
'\n'
终止行。例如,在Windows上,
“r”
“rb”
是不同的;
“r”
\r\n
转换为
\n
,以及
“rb
没有。当你阅读外来文本格式的文件时,事情会变得棘手,但我认为OP不需要担心这个问题。@KeithThompson:如果文件是作为作业的一部分交给他的,那么假设它是不安全的