char数组的奇怪输出转换为int - array [x]的魔法 - '0'

时间:2014-02-10 17:35:24

标签: arrays casting char buffer c99

所以我现在正在使用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 。这个减去是否与数组索引有关? 我假设这减去强制编译器使 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';我得到了不同的输出 - 有时是正面或负面的,但总是打印出这个特定的数字。

我的电脑上的BUFSIZ长8192字节。

1 个答案:

答案 0 :(得分: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,因此从-3减去时arr[0]的输出,以及1的正确输出你改为arr[1]。要查看键盘上所有标准字符的数值,请查看http://www.asciitable.com/

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