sscanf 格式参数不起作用

sscanf format parameter not working

本文关键字:不起作用 参数 格式 sscanf      更新时间:2023-10-16

用户输入指定格式的字符串

K i v

K 是一个字符串

我是整数

v 是一个整数


示例:"K 100 2">

字符char_cmd = K

整数 a = 100

整数 b = 2

cout << "Input your command to perfrom operation: " << endl
cin >> input;
sscanf(input.c_str(),"%s %d %d",&char_cmd,&a,&b);

我得到价值char_cmd没问题 当涉及到ints a&b时,它似乎没有复制用户输入的内容。

我环顾四周,似乎空白是问题所在

我能做些什么来实现这一点?

解决方案:

丢弃

cin >> input;
sscanf(input.c_str(),"%s %d %d",&char_cmd,&a,&b);

并将其替换为

cin >> char_cmd >>a >> b;

为什么OP在这里不起作用:

问题1:

cin >> input;

只读取一个空格分隔的标记。给定OP的样本输入"K 100 2",输入包含"K"。就这样。查看std::getline一次阅读多个单词。

问题2:

sscanf(input.c_str(),"%s %d %d",&char_cmd,&a,&b);

sscanf已被指示

  1. %s解析以空格分隔的字符串并将其存储在char_cmd
  2. %d解析有符号整数并将其存储在a
  3. %d解析有符号整数并将其存储在b

OP刚刚在他们的评论中澄清了char_cmd是一个char,而不是一个能够包含以空结尾的字符串的缓冲区。读取一个字符需要两个char,一个用于读取的字符,一个用于空。未定义的行为结果。

由于指向char数组的指针和指向char的指针看起来完全相同,因此sscanf无法检测到错误。实际上,因为sscanf接受可变参数,所以它无法检测到很多错误。这就是不使用它的第一个原因。

char char_cmd;
int a;
int b;
char input[100];
cin.getline(input,sizeof(input));
sscanf(input,"%c %d %d",&char_cmd,&a,&b);