C编程:如何在不使用-48值的情况下获得int的正常值?
所以我有一个循环检查用户输入:C编程:如何在不使用-48值的情况下获得int的正常值?,c,io,char,type-conversion,multiplication,C,Io,Char,Type Conversion,Multiplication,所以我有一个循环检查用户输入: int ch, num; while ((ch = getchar()) != '\n') { if (isdigit(ch)) { num = ch - 48; } } 所以根据这个表: Character Decimal Value 0 48 1 49 2 50 3 51 4 52 5 5
int ch, num;
while ((ch = getchar()) != '\n')
{
if (isdigit(ch))
{
num = ch - 48;
}
}
所以根据这个表:
Character Decimal Value
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
我用这种方法来获取我的号码
:num=ch-48
;
例如,如果我想通过10
?将我的编号
乘以,您可以在此处使用atoi()函数。您将从用户处获得ch as输入。
您可以将其转换为字符串,如下所示-
char number[2] ="";
number[0]=ch;
number[1]='\0'
num = atoi(number);
这会解决你的问题
如何在不使用-48值的情况下获得int的正常值
像这样:
num = ch - '0';
阅读更多
在这两种情况下,您只需执行以下操作:
num *= 10;
因为num
属于int
类型
警告:其他人建议获取数字,该数字应作为输入字符串,而不是字符!因此,如果您将一个字符传递给该函数(因此是一个以非null结尾的字符串,您将调用未定义的行为)。以下是从用户处读取输入直到新行的最佳方法。我正在发布一个示例,您可以查看它并根据需要实现代码
此示例将在integer
中读取用户输入,直到换行(\n)
。
确保最后没有给空格
示例代码:
#包括
内部主(空){
int i=0,大小,arr[10000];
焦炭温度;
做{
scanf(“%d%c”、&arr[i]、&temp);
i++;
}while(temp!='\n');
尺寸=i;
对于(i=0;i您应该始终使用惯用的
num = ch - '0';
原因是,这适用于C:C支持的任何编码。C要求数字0到9以升序连续显示。如果将'0'
的值硬编码为48,严格来说,您不是在编写可移植C
注意,由于参数提升的规则,表达式ch-'0'
在C中是int
类型('0'
在C中是int
类型)。因此,您可以自由地将其乘以10,方法与对任何int
类型应用算术运算相同。您使用哪一行进行用户输入?您可以将其张贴在此处。输入例如2 3 1 4 5,直到新行为止。您为什么不使用scanf()进行整数输入我认为你这样做的方式是不正确的,让我来回答这个问题。最好的方式是:)注意getchar()
在函数调用中出现读取错误的罕见事件中返回EOF
,这可能会导致发布的代码中出现无限循环。当使用getchar()控制循环时,最好始终检查EOF
)
。我尝试int n=atoi(ch);但是crash@DanaYeger它将崩溃,因为atoi()
需要字符串,而不是字符!请检查我的答案。@gsamaras Hist更新的答案按预期传递字符串。@DanaYeger-请查看我更新的答案,因为我已将字符转换为字符串,然后将其传递给atoi()。你的意思是你的。=)现在更新后的答案产生了太多不必要的步骤。我的意思是不需要这些额外的步骤,因为@DanaYeger不需要调用该函数。这个答案是可靠的,但有一点需要注意:它假设字符集中的数字是连续的和升序的。据我所知,当前定义的每个字符集都是连续的满足了这个假设,所以这可能不是问题……但是如果你是偏执狂,你可以使用开关(ch){case'0':…}
结构。@lockcmpxchg8b:C标准坚持这种情况。不需要偏执;只需遵循标准。哦,是的。根据n1750,S5.2.1:“在源和执行基本字符集中,上述十进制数字列表中0之后的每个字符的值应比前一个字符的值大一个。"这种方法更灵活,因为它可以接受多位数,但输入一位数时,scanf不会返回。用户必须按enter键以表示他们已完成键入。此答案接受由非数字字符分隔的多个数字,这不是OP的问题。输入一位数时,它将返回。I例如,我不想在数组中插入当前的int,但要用它做其他事情:循环中的当前数字是&temp?我将此代码粘贴到源文件中并编译。键入一个数字后,scanf
调用不会返回。与OP的getchar()不同,用户还必须点击是的,但是在输入之后,他需要按回车键。
num = ch - '0';