我想在一行中输入数字。这里有问题
我尝试跟随另一个。我不知道这是什么问题 它注意到了我 “ [警告]不建议将字符串常量转换为'char *'[-Wwrite-strings]”
#include <stdio.h>
#include <string.h>
char numstr[100];
char *tok;
char *dem = " ";
main(){
printf("Num:");
scanf("%s",numstr);
tok = strtok(numstr,dem);
while(tok != NULL){
printf("Token: %s\n",tok);
tok = strtok(NULL,dem);
}
}
显示
输入
Num: 55 33 66
输出
Token: 55
我想要
Token: 55
Token: 33
Token: 66
答案 0 :(得分:1)
您的问题是对"%s"
conversion-specifier 的正确使用的误用或误解之一。 "%s"
只会读到遇到第一个空白为止,然后它将停止。使用"55 33 66"
,scanf
将仅读取"55"
,然后遇到空格并停止读取。
要阅读整行,可以使用字符类"%[^\n]"' instructing
scanf to read all characters NOT a
'\ n'`(因此基本上要进行阅读,直到找到换行符为止。
但是您尚未完成,在对阵列正确使用scanf
之前,还有两个任务需要执行。由于您的数组仅包含100
个字符,因此您必须使用 field-width 修饰符告诉scanf
读取不超过99
个字符,以保护数组绑定,因此为 nul-terminate 字符保留了空间。其次,您必须验证每个用户输入功能的返回,以确保您正在处理有效数据。将这些发挥作用,您可以做到:
printf ("Num: ");
if (scanf ("%99[^\n]", numstr) != 1) {
fputs ("error: user canceled input.\n", stderr);
return 1;
}
您的标记化可以不变地使用,但是定界符要求的type
是const char*
,因此您应该更新dem
的声明,例如,
#include <stdio.h>
#include <string.h>
char numstr[100];
char *tok;
const char *dem = " \t\n";
int main (void) {
printf ("Num: ");
if (scanf ("%99[^\n]", numstr) != 1) {
fputs ("error: user canceled input.\n", stderr);
return 1;
}
tok = strtok (numstr, dem);
while (tok != NULL) {
printf ("Token: %s\n", tok);
tok = strtok (NULL, dem);
}
}
(注意:,我制作了dem
const char*
,并添加了tab
'\t'
和newline
'\n'
个字符以及分隔符)
使用/输出示例
$ ./bin/strtok_numstr
Num: 55 33 66
Token: 55
Token: 33
Token: 66
仔细检查一下,如果还有其他问题,请告诉我。
答案 1 :(得分:0)
您需要执行scanf("%[^\n]",&numstr)
,否则它将在空格之前停止或使用fgets(numstr, 100, stdin)
。
答案 2 :(得分:-1)
#include <stdio.h>
#include <string.h>
char numstr[100];
char *tok;
char *dem = ' ';
int MAX_CHAR = 100; // Number character to read from the input buffer
int main(){
printf("Num:");
fgets(numstr, MAX_CHAR, stdin);
tok = strtok(numstr, dem);
while(tok != NULL){
printf("Token: %s\n",tok);
tok = strtok(NULL,dem);
}
return 0;
}