我尝试提示用户输入多个数字,当用户输入字符串时,程序会计算这些数字的总和。我遇到了困难,因为我希望尽可能简化程序而不创建其他变量来存储字符串等。
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;
答案 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()
),然后尝试确定它是什么。如果它是整数,您可以使用atoi
或strtol
进行转换。如果它是浮动的,您可以使用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;
}