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

标签 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

我的错误是什么?

最佳答案

原因是您不仅打印该char,而是打印整个“字符串”,例如

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"),因为它只是一种处理 IDE 的非标准方法,这些 IDE 可能需要带有事件循环的 GUI 程序,而不是带有事件循环的命令行程序文本输出。

关于C Array char - 当我尝试写入位置 0 时,程序写入位置 0 和 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40655314/

相关文章:

c++ - 非阻塞 mlock()

python - 如果它出现在纯 numpy 中的另一个数组中,则有效地删除数组的每一行

c - 对具有数组类型错误的表达式进行赋值,无法将 char 数组值设置为结构中的变量

c - 将 C 中给定文本中的每个单词替换为另一个单词

c - 线程访问另一个线程的堆栈

c - 我如何找到该程序的许可证 key ?

c - 为什么我可以在 C 中将整数隐式转换为 char

php - 如何检查一个数组是否包含 PHP 中的另一个数组?

C++:是什么导致了这个堆栈粉碎错误?

c++ - 如何在C++中将整数转换为字符