我正在编写一个程序,我需要在char
数组上存储一个字符。
我的问题是当我尝试编写char数组时,postion[0]
会打印postion[0]
+ position[1]
+ position[2]
,而我只希望得到角色position[0]
。
这是我为解决这个问题而编写的程序:
#include <stdlib.h>
#include <stdio.h>
int main()
{
char position[3] = { '\0', '\0', '\0'};
int Number;
int i;
for (i = 0; i < 3; i++)
{
printf_s("\n\nNumber-> ");
fflush(stdin);
scanf_s("%d", &Number);
position[Number - 1] = 'O';
}
printf("\n\n%s", &position[0]);
printf("\n\n%s", &position[1]);
printf("\n\n%s\n\n\n", &position[2]);
system("pause");
return 0;
}
我的错误是什么?
答案 0 :(得分:2)
原因是您不只是打印char
而是打印整个&#34; 字符串&#34;,例如
printf("%s\n", &position[0]);
与
完全相同printf("%s\n", position);
然后,
printf("%s\n", &position[1]);
相当于从第二个字符而不是第一个字符开始打印字符串。
但是这不是代码中的真正问题,真正的问题是当Number == 3
没有null
终结符时,会导致任何printf()
中的未定义行为无论是有意还是错误,你不了解printf()
如何工作以及每个说明符的作用,你必须在使用任何函数之前仔细阅读文档。
要解决此问题,您只需打印实际字符即可。为此,您必须使用%c
说明符而不是%s
,如此
printf("%c\n", position[1]);
会打印数组的第二个元素。
我建议您修复代码的其他问题是
在尝试访问阵列之前检查Number
的值,如果它足够大可能会导致无法解释的行为,或者它可能是负面的,这也是一个问题。
检查scanf_s()
的返回值,以确保您确实收到了用户的有效输入。
不要在行的开头使用\n
因为它很尴尬,大多数程序员都不会这样做,除非它真的有必要。
不要使用system("pause")
,因为它只是一种非标准方式来处理可能需要带有事件循环的GUI程序而不是带文本输出的命令行程序的IDE。 / p>
答案 1 :(得分:0)
要打印出position[0]
这样的单个字符,请使用:
printf("\n\n%c", position[0]);
而不是:
printf("\n\n%s", &position[0]);