gpt4 book ai didi

c - 关于在 C 中获取用户输入的查询

转载 作者:太空宇宙 更新时间:2023-11-04 06:33:49 25 4
gpt4 key购买 nike

这里我指的是来自“codechef.com”的一个问题。下面这段代码用于从用户那里读取初始计数。这将返回一个整数值。

这类似于执行 scanf("%d", &n);。但是大多数人都在使用这种方法从用户那里获取信息。

我不明白这段代码中的一行,我也不明白字符输入在哪里转换为整数。

int readuint()
{
int n = 0;
char c = fgetc(stdin);
do {
n = n * 10 + (c - '0');
} while ((c = fgetc(stdin)) != '\n');
return n;
}

有问题的项目是这一行 - n = n * 10 + (c - '0'); 这一行在做什么??

完整代码请访问:http://www.codechef.com/viewsolution/1221364

最佳答案

如果输入是 123,那么在循环的每次迭代中,它会计算:

n =  0 * 10 + ('1' - '0');
n = 1 * 10 + ('2' - '0');
n = 12 * 10 + ('3' - '0');
assert(n == 123);

数字的字符代码总是连续的,所以 '1' - '0' 是 1,等等。

它将数字的数字转换为数字。习惯成语;你会在 C 代码中看到很多。


显示的代码在很多方面都很草率:

int readuint()
{
int n = 0;
char c = fgetc(stdin);
do {
n = n * 10 + (c - '0');
} while ((c = fgetc(stdin)) != '\n');
return n;
}

名称表明它正在读取无符号整数 (uint),但使用的类型是有符号 intc 的类型应该是 int 因为 fgetc() (以及 getc()getchar( )) 返回 int 而不是 char。没有办法表明它遇到了 EOF。没有防止溢出的保护。没有针对输入中非数字的保护。修复所有这些需要大量代码,但代码的基本 self 保护意味着它应该更像是:

int readint(void)
{
int n = 0;
int c;
while ((c = fgetc(stdin) != EOF && isdigit(c))
n = n * 10 + (c - '0');
if (c != EOF && c != '\n')
ungetc(fp, c);
return n;
}

仍然没有防止溢出的保护措施,但它具有针对输入中的 EOF 和非数字的基本保护(通过将换行符或 EOF 以外的字符放回以供下一次读取操作重新处理)。


'1'-'0' (char) = (int)1? How does this conversion happen? From char to int: is it because we are assigning to an integer container — i.e int n?

作为Elchonon Edelson也就是说,'0' 和 '1' 等字符常量在 C 中是整数常量(在 C++ 中它们是 char 常量) ,'0''1' 的值通常分别为 48 和 49(但 C 标准不保证!)。所以,49 - 48 当然会得到 1

关于c - 关于在 C 中获取用户输入的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17332490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com