[英]fscanf return value for a string
对编码仍然很陌生,我真的对这个感到困惑。 我搜索到 fscanf 返回成功分配的字符数,那么为什么下面的代码返回 1 而不是 4?
string temp;
int len;
len = fscanf(fp, "%[^-,]s", temp);
printf("\n%s", temp);
printf("\nlen: %d", len);
temp[len] = '\0';
Output:
2020
长度:1
我搜索到 fscanf 返回成功分配的字符数
否。 fscanf()
返回成功分配的输入项的数量。
从fscanf(3)
的文档中,
返回值
成功完成后,这些函数将返回成功匹配和分配的输入项的数量; 如果发生早期匹配失败,此数字可以为零。
因此,请记住len = fscanf(...)
不会返回正确初始化的字符的长度,而是返回成功分配的输入项的数量。 在这种情况下,它是 1,这是正确的。
len = fscanf(fp, "%[^-,]s", temp);
排除集%[^-,]
的格式说明符不需要或包含尾随s
。
fscanf
的返回值是分配的项目数,而不是字符数。
此外, temp[len] = '\0';
这里是错误的,而且通常是多余的。
下面显示了如何正确解析第一个-,
分隔标记,使用完整的错误检查并使用%n
检索实际使用的字符数。
#include <stdio.h>
int main()
{
const char str[] = "2021-02-12";
char tok[79 + 1]; // `%79s` or similar to prevent buffer overrun
int len; // number of characters actually parsed
int cnt = sscanf(str, "%79[^-,]%n", tok, &len); // number of items matched and assigned
if(cnt != 1)
{ printf("error reading token\n"); return 1; }
printf("input: \"%s\"\n", str);
printf("items: %d\n", cnt);
printf("chars: %d\n", len);
printf("token: \"%s\"\n", tok);
printf("remaining: \"%s\"\n", str + len);
return 0;
}
Output :
input: "2021-02-12"
items: 1
chars: 4
token: "2021"
remaining: "-02-12"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.