c - 使用 gets func 时 int var 的值是什么

标签 c gets

我对代码高尔夫感兴趣,我从问题中看到了下面的代码:

write a program that gets two one-digit number from stdin separated by space and print the sum of two.

<表类=“s-表”> <标题> 标准输入 标准输出 <正文> 1 2 3 8 9 17

代码(非高尔夫)

main(n) {
    gets(&n);
    printf("%d",n%85-43);
}

try it online

我调试了代码并得到了值 n .

<表类=“s-表”> <标题> 标准输入 标准输出 n <正文> 1 2 3 3285041

代码输出答案,因此它不能是未定义的值并且必须具有某种含义。

怎么会3285041出来了吗?

最佳答案

在我们开始解释之前,我将把您的代码修复为与现代标准兼容的版本,并删除已弃用/不安全的函数 -

所以 -

#include <stdio.h>
int main(int n, char* b[])
{
    fgets((char*)&n, sizeof(n), stdin);
    printf("%d",n%85-43);
}   

现在已经更正了,让我们看看解释。

因此,fgets(或您的情况下的gets)通常用于扫描字符串。它是如何扫描整数的,也是其中的 2 个。

事实并非如此,它会将其作为字符串进行扫描,但在用于整数的内存中进行扫描。因此,整数变量的位表示将使用字符串的位表示。这是 n 将获得的值 -

该代码依赖于第二个字符 ' ' 和所存储的整数,以便首先存储最低有效字节。 它还假设字符使用 ASCII 表示形式。

0 的 ASCII 值为 48,数字 x(单个数字)的 ASCII 值为 48 + x >。 ' ' 的 ASCII 值为 32

假设两个数字是xy,n将为

(48 + x) + (32 * 256) + ((48 + y) * 65536)

我们最终使用的是n % 85 - 43

如果简化n % 85,您将得到x + y + 43

最终结果是 x + y,这是 printf 打印的结果。

编辑: 这是 n % 85

的简化
((48 + x) + (32 * 256) + (65536 * (48 + y))) % 85
((48 + x) % 85 + (32 * 256) % 85 + (65536 * (48 + y)) % 85) % 85
(48 + x + 32 + (3145728 % 85 + 65536y % 85) % 85) % 85
(80 + x + (48 + 65536y) % 85) %85
(80 + x + (48 + ((y % 85) * 1) % 85) % 85
(128 + x + y) % 85
43 + x + y 

关于c - 使用 gets func 时 int var 的值是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48219777/

相关文章:

c - 在此代码中除了使用 gets(c) 和 gets(s) 之外,还有什么替代方案?

c - 为什么连续的 recvfrom() 调用在 UDP 套接字的情况下被阻塞

c - 马里昂巴德游戏错误异或

c - getline函数返回值为-1时内存泄漏

在unix c中逐字节比较两张图片

c : gets() and fputs() are dangerous functions?

arrays - strtok 大小 1 的读取无效

gets() 函数中的 CR 字符

c - 为什么我的程序在提供输入后无法运行?

c - 错误: expected declaration specifiers or '...' before string constant [puts() and gets() statement errors