gpt4 book ai didi

c - 在 C 中使用 sscanf 读取带有空格的字符串时,标点符号会导致错误

转载 作者:行者123 更新时间:2023-12-04 06:01:29 25 4
gpt4 key购买 nike

更新 : 使用 char string[sizeof buffer - 1] 正确初始化字符串已经解决了崩溃问题,但我仍然很好奇有多个标点符号与它有什么关系!

我试图从“一些文本”形式的文件中读取一个字符串。使用 sscanf带图案\"%[^\"]\"到目前为止对我来说效果很好,但是一旦我开始在字符串中添加标点符号,程序就开始崩溃。

似乎只有在使用多个标点符号时才会出现错误,而不管它是什么标点符号或标记的位置。无论文件中标点符号行的位置如何,它也会发生(即,即使最后一行没有标点符号,错误仍然发生)。

无论如何,以下是我到目前为止的代码:

char* func(char* f_name);
FILE* file = get_file(f_name,"r"); // a short function I wrote to get the
// file pointer from the current
// directory. The error is almost
// certainly not here.
if (file == 0) {
print("Unable to load file\nExiting...");
exit(-1);
}

char* pattern = "\"%[^\"]\"";
int read_args = -1;
char* string; // string size is unknown until read
char buffer[1200]; // i expect very long line of data in the file

while ( fgets( buffer, sizeof(buffer), file ) != NULL ) {
printf("found line: %s\n",buffer);
read_args = sscanf(buffer, pattern, string);
printf("num args: %d\n",read_args);
printf("read value: %s\n", string);
}

fclose(file);
return string;
}

以下是我试过的一些数据。在标记为“不成功”的地方,程序编译、运行所有内容,并在退出前崩溃。
"test test test" // successful
"test, test test" // successful
"test test; test" // successful

"test, test, test" // unsuccessful
"test; test. test," // unsuccessful

如果此问题得到解决,我计划使用更复杂的模式,并且正在使用模式 %d \"%[^\"]\" \"%[^\"]\" 读取数据在发生此错误之前成功。提前感谢您的任何答案。

最佳答案

您的代码调用了未定义的行为,因为您正在扫描随机内存。
string变量永远不会被初始化,所以 sscanf() 写入的字符串的目的地未定义。

你需要例如

char string[sizeof buffer - 1];

它并不总是崩溃的事实只是运气,代码一直在调用未定义的行为。根据您的示例,可能只是使用标点符号,扫描的文本更长,因此覆盖了更多的内存,最终在遇到足够重要的东西时触发崩溃。

关于c - 在 C 中使用 sscanf 读取带有空格的字符串时,标点符号会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8863871/

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