3

我需要编写一个只接受 1-10 整数(不包括字符和浮点数)的程序。我正在使用fgets. 它运行但我不能排除浮点数。这是我的代码的一部分:

char choice[256];
int  choice1;

fgets(choice, 256, stdin);
choice1 = atoi(choice);
if (choice1 > 0 && choice1 <= 10)
{
    switch (choice1)
    {
    case 1:

    ...

    case 10:

帮助?

4

3 回答 3

5

您可以使用strtol()来进行转换,而不是atoi(). 这将为您提供一个指向不属于数字的第一个字符的指针。如果该字符不是空白,则该数字不是整数。

于 2013-08-29T07:27:10.447 回答
1

编辑

像下面这样的东西可能会有所帮助。您需要根据您的要求进行更改。参见手册页strtol

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
  int choice1;
  char *endptr, choice[256];

  fgets (choice, 256, stdin);

  choice1 = strtol (choice, &endptr, 10);
  if (endptr != NULL && *endptr != '\n')
  {
    printf ("INVALID\n");
  }

  printf ("%d\n", choice1);
  return 0;
}

endptr保存第一个无效字符的位置。需要与 进行比较,\n因为它fgets还将换行符存储在缓冲区中。您可能希望以其他方式处理此问题。上面的代码显示了一个大纲。

或者您可能希望手动迭代字符串并根据内容丢弃它。可能像下面这样的东西会起作用。

fgets (choice, 256, stdin);
for (i=0; choice[i] != '\0' || choice[i] != '\n'; i++)
{
  if (!isdigit (choice[i]))
  {
    flag = 0;
    break;
  }
}

当您使用fgets如果该行以换行符终止时,它将存储在字符串中。

于 2013-08-29T07:55:37.060 回答
0

你可以帮助做while循环。

int c;
do
{
 c = getchar();
if(atoi(c) > 0 && atoi(c) <=9)
{
// append character to character array(string)
// For user to under stand what he has entered you can use putchar(c);
}
}while(c!=13)

这不是确切的解决方案,但你可以做这样的事情。不幸的是,我没有在我的机器上安装 c 编译器,所以我没有尝过这段代码。

于 2013-08-29T07:38:27.940 回答