繁体   English   中英

fscanf 返回一个字符串的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM