输入不同的类型(在C中)

时间:2014-07-09 04:03:41

标签: c

我尝试提示用户输入多个数字,当用户输入字符串时,程序会计算这些数字的总和。我遇到了困难,因为我希望尽可能简化程序而不创建其他变量来存储字符串等。

int menu(int choice){
  int total = 0, values = 0;
  char *string = (char*) &values;
  switch(choice){
    case 1: printf("Enter your values separated by a whitespace: ");
      while(string != "compute") {
        scanf("%d",&values);
        total = total + values;
      }
  }
  return total;
}

我希望用户输入与他/她想要的数量一样多的数字(显然在内存限制内),所以我必须不断预测一个int(或其他"数字"),那么'是预测字符串的最有效方法吗?

我知道以下几行有点粗略,但为什么我想要变量" string"对待"价值观"像字符串/字符类型?     char *string = (char*) &values;

4 个答案:

答案 0 :(得分:0)

当你这样写的时候

int total = 0, values = 0;
char *string = (char*) &values;

您将指针字符串设置为指向整数值values,因此如果用户输入的值大于sizeof(values),即sizeof(int),程序将崩溃。

而是使用专用缓冲区作为输入字符串

char string[128] = {0};

scanf可以用于输入,但使用fgets()来最小化缓冲区溢出的风险更安全:

fgets( string, sizeof(string), stdin );

如果您需要保持输入的单个值,则声明一个整数数组,例如

int values[100];

当用户输入内容时,请检查' string'的内容。并看看它 包含计算 - 检查第一个字符可能就足够了 - 例如if ( string[0] == 'c' ) else将字符串转换为int并将其放在值数组中:

values[i++] = atoi(string);

编辑:

正如McNabb所指出的,fgets()会在字符串中添加\ n,因此如果要比较整个字符串,则必须考虑到这一点,例如

if ( !strncmp( "compute", string, strlen("compute") ) 
{...}

答案 1 :(得分:0)

最有效的方法是读取字符串(使用fgets()),然后尝试确定它是什么。如果它是整数,您可以使用atoistrtol进行转换。如果它是浮动的,您可以使用strtod。否则,您可以根据需要解析字符串。

所以你最终得到这样的东西:

char str[15];
long sum = 0, val;
char* ptr;
while (1)
{
    fgets(str, 15, stdin);
    if (0 == strcmp(str, "compute"))
    {
        printf("sum: %d\n", sum);
        break;
    }
    val = strtol(str, &ptr, 10);
    // error-check here.
   sum += val;
}

另一个更简单的选项可能是读取整数(使用scanf,如上面的代码中所示)直到文件结束,然后打印总和。这种方法有一些限制:您需要通过某个具有已定义EOF的通道提供输入,并且在整数列表结束后无法接收更多输入。正如Havenard所建议的那样,使用特定值(例如0)作为哨兵,没有这些缺点,但也不允许哨兵值出现在你的数字列表中。

答案 2 :(得分:0)

要读取字符串,您必须为其分配一些空间。你不能把它读成一个整数。

要支持读取可能是整数或字符串的输入,您必须读取字符串;然后你可以尝试将字符串转换为整数。

例如:

char buffer[50];
scanf("%49s", buffer);

if ( 0 == strcmp(buffer, "compute") )
    return 0;    // they typed "compute"

if ( 0 == sscanf(buffer, "%d", &number) )
    break;       // they typed something that was not a number

total += number;

答案 3 :(得分:0)

不确定为什么要在此时比较字符串。如果您只想读取空格分隔的整数,直到输入非整数值,请让scanf为您完成工作:

int menu(int choice){
  int total = 0;
  int value;
  switch(choice){
    case 1: printf("Enter your values separated by a whitespace: ");
      while(scanf("%d",&value) > 0) {
        total += value;
      }
  }
  /* Here, use scanf to get the first non-integer value entered */
  return total;
}