用户输入指定格式的字符串
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
已被指示
%s
解析以空格分隔的字符串并将其存储在char_cmd
%d
解析有符号整数并将其存储在a
%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);