C - 将用户输入拆分为令牌并在输出

时间:2017-02-01 02:27:15

标签: c

好的,我要澄清的问题是,用户输入,即 “嘿有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?

1 个答案:

答案 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");
}