gpt4 book ai didi

C 字符串字符串比较总是导致 false

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:14 26 4
gpt4 key购买 nike

我正在尝试在文件中查找字符串。我通过修改 getline 手册页中的代码片段编写了以下内容。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
FILE * fp;
char * line = NULL;
char *fixed_str = "testline4";
size_t len = 0;
ssize_t read;

fp = fopen("test.txt", "r");
if (fp == NULL)
exit(EXIT_FAILURE);

while ((read = getline(&line, &len, fp)) != -1) {
printf("Retrieved line of length %zu:\n", read);
printf("%s", line);

if (strcmp(fixed_str,line)==0)
printf("the match is found\n");
}
//printf("the len of string is %zu\n", strlen(fixed_str));

fclose(fp);
if (line)
free(line);
exit(EXIT_SUCCESS);
}

问题是尽管 getline 成功并正确地迭代了文件中的所有行,但 strcmp 的结果始终为 false。由于换行符,fixed_str 的长度为 9,文件中的相等字符串的长度为 10(我对吗?)。但是在 strncmp 的帮助下比较 9 个字符仍然会产生错误的结果。我还排除了大写和空格的可能性,所以我认为我做错了什么

test.txt如下

test line1
test line2
test line3
testline4
string1
string2
string3
first name

我尝试了所有条目,但没有成功

注意:在我的实际程序中,我必须从另一个文件读取fixed_str

最佳答案

来自getline() man page (我的重点):

getline() reads an entire line from stream, storing the address of the buffer containing the text into *lineptr. The buffer is null- terminated and includes the newline character, if one was found.

您的 fixed_str 没有换行符。

因此去除任何换行符(例如):

char* nl = strrchr( line, '\n' ) ;
if(nl != NULL) *nl = `\0` ;

或者更高效,因为 getline() 返回行长度(在您的情况下为 read):

if(line[read - 1] == '\n' ) line[read - 1] = `\0` ;

'\n' 添加到 fixed_str 可能看起来更简单,但这不是一个好主意,因为文件中的最后(或唯一)行不会有一个,但可能是匹配项。

按照您的问题中的描述使用 strncmp() 应该有效,但如果没有看到尝试,很难发表评论,但无论如何它都是一个有缺陷的解决方案,因为它会匹配 例如以下所有:

testline4
testline4 and some more
testline4 12345.

如果 fixed_str 取自控制台或文件输入而不是常量,输入方法和数据源可能会导致问题,替代行结束约定的可能性也可能导致问题。为了让它更健壮,你可以这样做:

// Strip any LF or CR+LF line end from fixed_str
char* line_end = strpbrk( fixed_str, "\r\n" ) ;
if( line_end != NULL ) *line_end = '\0' ;

// Strip any LF or CR+LF line end from line
line_end = strpbrk( line, "\r\n" ) ;
if( line_end != NULL ) *line_end = '\0' ;

或者@AndrewHenle 指出的更简单(即更好)的解决方案:

// Strip any LF or CR+LF line end from fixed_str
fixed_str[strcspn(line, "\r\n")] = '\0';

// Strip any LF or CR+LF line end from line
line[strcspn(line, "\r\n")] = '\0';

这样无论行以空结尾、CR 还是 CR+LF 都可以比较任一输入,并且两个输入之间的行结尾甚至可能不同。

关于C 字符串字符串比较总是导致 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57082143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com