gpt4 book ai didi

c - fscanf 函数无法识别管道字符

转载 作者:行者123 更新时间:2023-12-02 08:30:20 28 4
gpt4 key购买 nike

我正在尝试使用 c 读取一个文件,其中每个变量都由竖线字符分隔。我尝试了以下

fscanf(fp, "%s[|], %s[|], \n", str1, str2);

括号之间的字符是垂直线:竖线字符。它可以在字符 \ 上方的许多键盘上找到。

传入的字符串没有在管道字符上拆分,整个字符串都在str1中。
我做错了什么,我该如何解决?

最佳答案

scanf 中格式,%s意思是“匹配任何不包括空格的字符序列”,所以我猜你的文件不包含任何空格。

要匹配单个 |,您只需在格式中插入一个 |,因为在 scanf 格式中,除了空格和 % 匹配自身。 (包括 [。)但是,每种格式都独立于任何其他格式,因此 %s|不会意味着“将任何字符串匹配到 |”。这意味着“匹配任何不包括空格的字符串,然后是 |”。

如果你想匹配任何不包含|的字符串,你需要%[^|] .请注意,这与任何其他格式说明符一样,以 % 开头;如果没有 %,它将匹配文字字符串 [^|] .

与往常一样 scanf和 friend 们,你需要考虑缓冲区溢出。有很多关于始终使用最大宽度的建议,但如果你有一个 Posix 2008 兼容的标准库(与任何不太古老的 glibc 一样),那么你可以使用 m资格获得 scanf为您分配一个适当大小的内存区域。为了使用这个,你需要提供一个指向缓冲区指针的地址,而不是一个缓冲区指针,你必须记住在完成后释放()提供的缓冲区指针用它来避免内存泄漏。例如,您可以这样做:

int main() {
char* str1;
char* str2;
// Processing loop
for (;;) {
str1 = str2 = NULL; // Be safe
// This reads the variable before the first | into str1 and the rest
// of the line into str2. %*c will skip over the newline character.
int rc = scanf("%m[^|]|%m[^\n]%*c", &str1, &str2);
if (rc == EOF) break;
if (rc != 2) {
// Handle error
printf("Found %d values\n", rc);
} else {
// Do something with the strings
printf("s1=%s\ns2=%s\n", str1, str2);
}
// Free the allocated buffers
free(str1); free(str2);
}
return 0;
}

最后,一点建议:总是检查 scanf 的返回值(如上)。那会告诉你有多少模式匹配;如果它少于模式的数量,你就知道出了问题。

关于c - fscanf 函数无法识别管道字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27576784/

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