繁体   English   中英

C - 将用户输入拆分为令牌并在输出中识别/格式化它们

[英]C - Splitting a user input up into tokens and identify/format them in output

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM