所以我现在正在使用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字节。
答案 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/
至于从数组末尾输出,我认为这是未定义的行为,因为你实际上没有为这些索引分配任何内容。