为什么输出不了字符数组存储的数据
首先,让我们分析spacechar函数。这个函数的目的是将整数n的每一位数字以空格分隔的形式存储在字符数组p中。但是,函数中有几个错误:
*p++=(n%10); 这行代码将n的当前个位数赋值给p指向的位置,但这样赋值的是整数值而不是其字符表示。在C语言中,字符实际上是小的整数,所以直接赋值会导致输出时显示该整数值对应的ASCII字符,而不是数字字符。
在写入数字后,你紧接着写入了一个空格字符' ',这是正确的。
在循环结束后,你使用了*p--='\0';来在字符数组末尾添加空字符\0以标识字符串的结束。这是正确的,但是p已经因为之前的递增操作指向了数组的下一个位置,所以应该先递减p再赋值为\0。
接下来,我们来修正spacechar函数:
void spacechar(int n, char* p) {
if (n == 0) {
*p++ = '0'; // 特殊处理n为0的情况
*p++ = ' ';
}
while (n > 0) {
*p++ = (n % 10) + '0'; // 将数字转换为对应的字符
*p++ = ' ';
n = n / 10;
}
*(p - 1) = '\0'; // 移除末尾的空格,并添加字符串结束符
}
注意:
我们增加了对n == 0的特殊处理,因为当n为0时,循环不会执行,需要单独处理。我们使用(n % 10) + '0'来将整数转换为对应的字符。例如,0 + '0'得到字符'0',1 + '0'得到字符'1',依此类推。在循环结束后,我们不再递减p两次,而是只递减一次来移除最后一个空格,并在正确的位置添加空字符\0。
现在,对于main函数中的输出问题,由于arr数组中没有正确写入数字字符,而是写入了整数值,所以当你尝试用puts(arr)输出时,它会解释那些整数值为ASCII字符,这就是为什么你看到的是小方框而不是期望的数字和空格。
关于putchar(arr)报错的问题,putchar函数用于输出一个字符,它期望一个int类型的参数(实际上是一个字符的ASCII码值),但是你不能直接传递一个字符数组arr给它。arr是一个指向字符数组首元素的指针,它的类型是char*,不是int。所以编译器会报错,因为它不能将char*类型的值转换为int。如果你想逐个字符地打印arr中的字符,你应该使用循环和putchar函数,或者简单地使用puts(arr)(如果arr是以空字符结尾的字符串)。