首页 > 解决方案 > 为什么这个动态字符数组在 C 中没有得到正确的输入?

问题描述

我正在试验这个非常基本的代码并遇到一些内存问题。

我注意到 char 数组没有正确读取输入,可能会占用新的行输入。该程序适用于 int 数组,但我仍然收到有关取消引用 NULL 指针的警告。

这是char数组,

#include <stdio.h> 
#include<stdlib.h>

int main()
{
    int N, i;
    char* set;
    scanf_s("%d", &N);
    set = (char*)calloc(N, sizeof(char));
    for (i = 0; i < N; i++)
    {
        scanf_s("%c", (set+i), 1);
    }
    for (i = 0; i < N; i++)
    {
        printf("%c", *(set + i));
    }
    return 0;
}

这是int数组,

#include <stdio.h> 
#include<stdlib.h>

int main()
{
    int N, i;
    int* set;
    scanf_s("%d", &N);
    set = (int*)calloc(N, sizeof(int));
    for (i = 0; i < N; i++)
    {
        scanf_s("%d", (set+i));
    }
    for (i = 0; i < N; i++)
    {
        printf("%d", *(set + i));
    }
    return 0;
}

如前所述,int 数组工作得非常好,但我仍然想修复警告。

无论如何,当我输入“ab c”作为输入并按回车时,char 数组的输出只是“a”和新行,或者我尝试只输入“a”并按回车,它甚至不允许我输入其他字符了。

我想了解究竟出了什么问题并想解决它。我正在使用的当前 IDE 是 VS,但我也想要一个 gcc 6.3 兼容版本。

编辑:我得到的错误是在 printf 行,它显示 -

Warning C6011 Dereferencing NULL pointer 'set+i'.

标签: c

解决方案


int有效的版本和无效的版本之间的主要区别在于char您使用%d%c- 并%d跳过空格但%c不跳过。

更改"%c"" %c",您就有了战斗的机会。

三个scanf()——或者scanf_s()如果你在 Windows 上工作——转换不会跳过空白。它们是%c%[…](扫描集)和%n


推荐阅读