C从控制台读取多个带空格的单词/参数
您好,我是C新手,我希望用户键入类似于C从控制台读取多个带空格的单词/参数,c,C,您好,我是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, "
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);
}
它总是打印输入was inspect
,但不读取以下空格和数字?
检查用户是否键入“inspect”并获取他以后键入的索引的正确方法是什么
谢谢你你几乎没有选择,你要选择一个,不要把它们混在一起
用于读取输入,考虑使用FFET。更安全,需要处理的例外情况更少。我列出了等效的sscanf,但它更难使用。它们都将为“输入”带来一个完整的行。请注意,FGET还将包括尾随的新行
// 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
} ;
} ;
尽量不要使用极小的缓冲区,使用更安全的默认值,如
字符输入[255]
。如果正在使用此缓冲区,请将此缓冲区长度传递到scanf
,以确保不会意外溢出:scanf(“%255s”,&input)
。谢谢。但在使用此功能时,我仍然存在相同的问题,我必须删除输入前的&
,以使其正常工作。输入
将不包含任何空间供strok
查找!%s
说明符在第一个空白字符处停止扫描。使用fgets
输入一行文本。对不起,我对这个太陌生了。如何使用fgets从控制台读取数据?使用stdin
作为文件流。我尝试了它,但我的变量input
似乎不包括上面评论中提到的空间和风向标号。我在xdrago评论之后扩展了fgets/scanf。