IT干货网

c之sscanf 函数未按要求读取格式

kerrycode 2024年10月25日 编程设计 18 0

我正在尝试在 C 中使用 sscanf 函数,但它不读取格式是必需的,我已经阅读了该函数的文档并遵循了示例,但它对我来说仍然效果不佳,因此我想要一些建议..

int main() { 
 
  long int id; 
  float grade,age; 
  char name[40],city[40],country[40],line[100]="388891477\tItzel\tGardner\t21\t6\tIran\tTehran"; 
 
  int read_items = sscanf(line,"%ld %*[\t] %[a-zA-Z -] %*[\t] %f %*[\t] %f %*[\t] %[a-zA-Z -] %*[\t] %[a-zA-Z -]", 
        &id,name,&age,&grade,country,city); 
 
  printf("readed line is: %ld %s %f %f %s %s. sscanf() read %d items\n",id,name,grade,age,country,city,read_items); 
 
} 

当前输出:

readed line is: 3888914775  0.000000 0.000000  @�'�. sscanf() read 1 items 

预期输出:

readed line is: 3888914775 Itzel Gardner  21.000000 26.000000 Iran Tehran. sscanf() read 6 items 

另一个编辑:

问题要求是添加制表符,因此如果输入中有空格,它应该返回此输入不正确并且不应读取它,这就是我添加制表符的主要原因,因此它只能读取具有制表符的输入在其中,例如,如果 id 和 name 之间的输入只有 1 个空格,则不应读取它。抱歉让大家感到困惑

所以在行[100]="3888914775 Itzel Gardner 21 26 Iran Tehran";

输入之间的分隔输入只能是制表符(不能是一两个空格..)

正确输入示例:

line[100]="388891477\tItzel\tGardner\t21\t6\tIran\tTehran"; 

请您参考如下方法:

据我所知,您的代码存在一些问题。

首先,%*[\t] 说明符会造成干扰,因此没有必要。 sscanf 中说明符之间的空格将导致所有空格被消耗。

其次,您拥有的 ID 值可能会溢出 long int,因此您可能需要使用 long long 而不是 %lld说明符。

最后,似乎有些混淆是空格还是制表符分隔字段。空格是所有字符串字段的有效值,但也在字段之间给出。您的评论提到了制表符,但我在您的 line 字符串中没有看到任何内容。如果您使用制表符分隔您的字段,事情会好得多,因为制表符不是您的说明符集的一部分。

这是我对您的代码的更新,更正了上述所有内容:

#include <stdio.h> 
 
int main() { 
 
  long long id; 
  float grade,age; 
  char name[40],city[40],country[40],line[100]="3888914775\tItzel Gardner\t21\t26\tIran\tTehran"; 
 
  int read_items = sscanf(line,"%lld %[a-zA-Z -] %f %f %[a-zA-Z -] %[a-zA-Z -]", 
        &id,name,&age,&grade,country,city); 
 
  printf("readed line is: %lld %s %f %f %s %s. sscanf() read %d items\n",id,name,grade,age,country,city,read_items); 
 
} 

输出:

readed line is: 3888914775 Itzel Gardner 26.000000 21.000000 Iran Tehran. sscanf() read 6 items 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!