好的,我要澄清的问题是,用户输入,即 “嘿有5个伙伴3.15今晚65”
我需要使用空格分隔符将此字符串拆分为标记,我可以做得很好。我的问题出现在3.15上,其中我卡住了,在我的赋值中,它声明如果它不是一个整数,我必须将它识别为一个字符串并输出看起来像这样的结果。
“str str int str str str int”
因为5和65是唯一的整数。
现在我这样做:
int main(int argc, char **argv)
{
char arr[66];
char *tokens[10];
int counter = 0;
char *ptr = strtok(arr, " \n");
while(ptr != NULL){
tokens[i++] = ptr;
ptr = strtok(NULL, " \n");
}
for(int i = 0; i < counter; i++){
if(!isdigit(*tokens[i])){
printf("str");
}else{
printf("int");
}
}
return 0;
}
我的问题是isdigit函数认为3.14是整数,我是否需要使用修饰符或其他东西使其识别为str?
答案 0 :(得分:1)
isdigit(*tokens[i])
只查看第一个字符,而不是整个标记/字符串。
要检测令牌是否为整数,请构成一个简单的辅助函数。根据需要调整。
// Look for an optional sign, at least 1 digit and then a null character.
int IsInteger(const char *s) {
if (*s == '+' || *s == '-') s++;
int digit_found = false;
while (isdigit((unsigned char) *s) {
s++;
digit_found = 1;
}
// end with null character?
return *s == '\0' && digit_found;
}
可以使用strtol()
等
int IsInteger(const char *s) {
char *endptr;
strtol(s, &endptr, 10); // no need to save result, just need to detect conversion.
return s != endptr && *endptr == '\0';
}
...
for(int i = 0; i < counter; i++){
if(IsInteger(tokens[i])) {
printf("str");
} else{
printf("int");
}
}
此外,增加counter
,而不是i
。
while(ptr != NULL){
// tokens[i++] = ptr;
tokens[counter++] = ptr;
ptr = strtok(NULL, " \n");
}