【发布时间】:2019-11-11 10:45:54
【问题描述】:
我需要输入一个由空格分隔的数字(可能是多个空格)的字符串。
下面我写的代码打印Invalid number只有输入是这种形式:
8a(数字后的字符)。
例如,如果我输入了a b c,它不会打印Invalid number 并继续执行程序。
基本上我需要检查字符串是否包含仅包含数字和空格。
如果它没有抛出Invalid number
如果是 - 使用输入的这些数字填充 *numbers 数组。
printf("Enter numbers:\n");
fgets (str, sizeof(int)*(size+1)+size*size, stdin);
token=strtok(str," ");
for(int i=0; (i<size) && (token!=NULL); i++) {
if(sscanf(token,"%d%c",&numbers[i],&ch) == 2 && (ch != ' ' && ch != '\n')) {
printf("Invalid number\n");
return 0;
}
token=strtok(NULL," ");
}
我尝试按照这种方式实现 strspn 函数:
printf("Enter numbers:\n");
fgets (str, sizeof(int)*(size+1)+size*size, stdin);
int index;
token=strtok(str," ");
for(int i=0; (i<size) && (token!=NULL); i++) {
if(sscanf(token,"%d",&numbers[i])==1){
index=strspn(token,"0123456789");
}if (str[index]!='\n'&&str[index]!='\0'){
printf("Invalid number\n");
return 0;
}
token=strtok(NULL," ");
}
对于输入:8 8a 8 程序不打印 Invalid number
【问题讨论】:
-
线代表什么?你能详细说明一下吗?
-
我应该在 fgets 行之后写吗?不需要for循环吗?
-
我编辑了帖子。如果我正确实现了这个功能,它不会产生我需要的解决方案。
-
strspn(token,"0123456789");- 你少了一个空格,它是strspn(token," 0123456789");if (str[index]!='\n'&&str[index]!='\0')- 它是if if (str[index] == '\n' || str[index] == '\0')数字无效,否则数字有效。man strspn strspn cppreference -
ctype.hcontiansisspacepubs.opengroup.org/onlinepubs/009695399/functions/isspace.html 和isdigitpubs.opengroup.org/onlinepubs/009695399/functions/isdigit.html,可能会让你的生活更轻松。
标签: c