【问题标题】:Distinguishing if int or char / string from user input区分用户输入是 int 还是 char / string
【发布时间】:2015-08-13 00:03:01
【问题描述】:

我正在尝试读取用户的输入。 我想区分提供的输入是 int、char 还是 string。

我尝试使用 scanf_s 来解决这个问题,但这并不奏效。有没有办法从用户那里获取输入,并判断这是一个整数、字符还是字符串?

这是我到目前为止所拥有的。

void CheckIfInt()
{
  char returnValue = 0;

  //loop until we are given a valid input
  while(true)
  {
    scanf_s("%c", &returnValue);
    scanf_s("%C");

    if(isdigit(returnValue))
    {
      //Do something
      break;
    }

    else if(returnValue == 'a')
    {
      //Do something else
      break;
    }
  }
}

【问题讨论】:

  • 发布不起作用的代码,以便我们帮助找出问题所在。 :)
  • 假设这是可能的/可取的。如何输入文本字符串“15”?
  • @Purag 很抱歉。我已经用我的代码对其进行了编辑。
  • 啊,所以你不想自动检测输入,你只想验证数字输入。这是一件好事(并且得到了很好的回答)。

标签: c validation parsing


【解决方案1】:

您应该做的第一件事是不要使用整数指针,而是使用字符指针。这样可以更轻松地一次查看整个输入一个字节。所以你的代码应该是这样的:

void ReadInteger(char* value, bool isX) { ... }

下一部分取决于您要执行的操作,或者您想将整行作为一个输入读取,或者读取某些内容直到遇到空格字符。我会假设后者,这又回到了你的问题。

如何判断你是否只阅读了一个字符

int isChar(char *value) {
    return value != NULL && strlen(value) == 1 && isalpha(value[0]);
}

如何判断你是否只读取一个整数

int isInteger(char *value) {
    int ans = 0;
    if (value != NULL && strlen(value) > 1) {
        while (*value && isdigit(*value)) {
            value++;
        }
        ans = (value == NULL);
    }
    ans;
}

如何判断你是否只是读取一个字符串

我觉得很懒,所以可以这样做:

int isString(char *value) {
    return !isChar(value) && !isInteger(value);
}

请注意,整数检查方法会告诉用户是否只输入数字,但不会告诉您该数字是否适合 32 位整数。如果你想要这个效果,你可以很容易地修改代码来实现这个

【讨论】:

  • 谢谢。这帮了大忙!
【解决方案2】:

您可以使用fgets 将输入读入字符数组,然后使用sscanf 对其进行解析。您可以查看字符数组以了解它是什么类型的数据。如果您提供输入示例,我可以向您展示代码。

【讨论】:

    【解决方案3】:

    这应该会有所帮助。您可以操作代码。

    int myNum;
    char myTerm;
    if(scanf("%d%c", &myNum, &myTerm) != 2 || myTerm != '\n')
        printf("failure\n");
    else
        printf("valid integer followed by enter key\n");
    

    原因:myNum 将始终包含一个整数,因为它是一个整数

    【讨论】:

    • 感谢您的宝贵时间。难道这段代码不适用于像“hello1234”这样的输入吗?它将继续读取直到达到 1,并且由于 1 是数字而中断。它将触发标志为真,并进入循环下方的if语句
    猜你喜欢
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2013-10-11
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多