C Array char - 当我尝试写入位置0时,程序写入位置0和1

时间:2016-11-17 12:47:20

标签: c arrays char

我正在编写一个程序,我需要在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;
}

Program output

我的错误是什么?

2 个答案:

答案 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]);

会打印数组的第二个元素。

我建议您修复代码的其他问题是

  1. 在尝试访问阵列之前检查Number的值,如果它足够大可能会导致无法解释的行为,或者它可能是负面的,这也是一个问题。

  2. 检查scanf_s()的返回值,以确保您确实收到了用户的有效输入。

  3. 不要在行的开头使用\n因为它很尴尬,大多数程序员都不会这样做,除非它真的有必要。

  4. 不要使用system("pause"),因为它只是一种非标准方式来处理可能需要带有事件循环的GUI程序而不是带文本输出的命令行程序的IDE。 / p>

答案 1 :(得分:0)

要打印出position[0]这样的单个字符,请使用:

printf("\n\n%c", position[0]);

而不是:

printf("\n\n%s", &position[0]);