Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程:如何在不使用-48值的情况下获得int的正常值?_C_Io_Char_Type Conversion_Multiplication - Fatal编程技术网

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';