【问题标题】:Strange output of char array converted to int - magic of array[x] - '0'char 数组的奇怪输出转换为 int - 数组 [x] 的魔力 - '0'
【发布时间】:2014-03-08 04:36:45
【问题描述】:

所以我现在正在玩弄 char 数组转换和测试这个简单的代码:

#include <stdio.h>

int main(void) {

    char arr[BUFSIZ];
    printf("Input: ");
    fgets(arr, sizeof(arr), stdin);
    int x = arr[0] - '0';
    printf("Output: %d\n", x);
}

输出应该是变量x的值,它是输入的第一位。 但是,如果将负整数作为输入传递,我会得到:

jharvard@appliance (~/CS50/pset1): ./test
Input: -123
Output: -3

输出应该是-1,但是是-3。这 minus 是否与数组索引有关? 我假设这会强制编译器使 array[-1] index 输出的值?

我认为这就是重点,因为将行 int x = arr[0] - '0'; 更改为 int x = arr[1] - '0'; 后,我明白了:

Input: -123
Output: 1

当传递负数时。

还有另一个例子。 将 int x 行更改为 int x = arr[BUFSIZ - 1] - '0'; 时,我得到:

jharvard@appliance (~/CS50/pset1): ./test
Input: -123
Output: -40
jharvard@appliance (~/CS50/pset1): ./test
Input: 123
Output: -40
jharvard@appliance (~/CS50/pset1): ./test
Input: 122
Output: -40
jharvard@appliance (~/CS50/pset1): ./test
Input: 890
Output: -40

无论我传递的各种正数还是负数,在这种情况下输出总是-40

更改索引后,例如到int x = arr[BUFSIZ - 2] - '0';int x = arr[BUFSIZ - 7] - '0'; 我得到了不同的输出——有时是正数或负数,但总是会打印出这个特定的数字。

我 PC 上的 BUFSIZ 长度为 8192 字节。

【问题讨论】:

  • 我猜问题是- 符号,为什么不直接使用atoi() 代替:int x = atoi(arr);

标签: arrays casting char buffer c99


【解决方案1】:

当您输入-123 时,数组将被字符'-''1''2''3' 填充。数组看起来像:

arr[0] = '-'
arr[1] = '1'
arr[2] = '2'
arr[3] = '3'
arr[4...BUFSIZ] = ???

如您所见,arr[0] 是字符 '-',而不是整数 -1'-' (45)的数值比'0' (48)的数值小3,所以arr[0]减法输出-3,换成arr[1]输出正确1。要查看键盘上所有标准字符的数值,请查看http://www.asciitable.com/

至于从数组末尾输出,我认为这是未定义的行为,因为您实际上并没有为这些索引分配任何东西。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2021-05-03
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多