[英]C read multiple words/arguments with space from console
嗨,我是 C 新手,我希望用户输入类似inspect 2
以显示该示例中位置 2 处的数组值。
我无法让它工作
char input[20];
scanf("%s", input);
if (strcmp(strtok(input, " "), "inspect") == 0) {
char str[20];
int idx;
printf("input was %s", input);
idx = sscanf(input, "%s %d", str, &idx);
}
它总是打印input was inspect
但未读取以下空格和数字? 检查用户是否输入了“inspect”并获取他之后输入的索引的正确方法是什么?
谢谢你
你的选择很少,你想选择一个而不是把它们混在一起。
要读取输入,请考虑使用 fgets。 更安全,处理的例外更少。 我已经列出了等效的 sscanf,但它更难使用。 他们都将引入完整的“输入”行。 请注意, fgets 还将包括尾随的新行。
// make buffer large enough.
char input[255] ;
if ( fgets(input, sizeof(input), stdin) != NULL ) {
...
}
// OR
if ( sscanf("%19[^\n]", input) = 1 ) {
} ;
对于解析:解析输入字符串的选项很少。
在选项之间,我会投票支持 sscanf,因为它提供了对错误输入、溢出等的最大验证和保护。当 strtok 返回 NULL 时,strcmp(strtok(...)) 很容易导致 SEGV 错误。
使用 sscanf
if ( sscanf(input, "inspect %d", &idx) ==1 ) {
... Show Element idx
} ;
使用 strtok/strcmp
if ( strcmp(strtok(input, " "), "inspect") == 0 ) {
if ( sscanf("%d", strtok(NULL, " "), &idx) == 1 ) {
.. Show element idx
} ;
} ;
使用 strtol
if ( strcmp(strtok(input, " "), "inspect") == 0 ) {
char *stptr = strtok(input, " "), *endptr = NULL ;
idx = strtol(stptr, &endptr, 10) ;
if ( endptr != stptr ) {
.. Show element idx
} ;
} ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.