sscanf格式参数不起作用

时间:2017-03-26 18:11:24

标签: c++ string user-input scanf

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

  

K i v

     

K是一个字符串

     

我是一个int

     

v是一个int

  

示例:" K 100 2"

     

char char_cmd = K

     

int a = 100

     

int 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的值没问题 当涉及到一个&amp; b它似乎没有复制用户输入的内容

我环顾四周,似乎白色空间是问题

我该怎么做才能做到这一点?

2 个答案:

答案 0 :(得分:1)

解决方案:

弃掉

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

并将其替换为

cin >> char_cmd >>a >> b;

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

问题1:

cin >> input;

只读取一个以空格分隔的标记。给定OP的样本输入,&#34; K 100 2&#34;,输入包含&#34; K&#34;。这就是全部。查看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
  4. OP刚刚在评论中澄清char_cmdchar,而不是能够包含空终止字符串的缓冲区。读取一个字符将需要两个char s,一个用于读取字符,一个用于null。未定义的行为结果。

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

答案 1 :(得分:0)

char char_cmd;
int a;
int b;
char input[100];

cin.getline(input,sizeof(input));
sscanf(input,"%c %d %d",&char_cmd,&a,&b);