Почему этот динамический массив символов не получает правильных входных данных в C? - PullRequest
0 голосов
/ 15 мая 2019

Я экспериментирую с этим очень простым кодом и сталкиваюсь с некоторыми проблемами с памятью.

Я заметил, что массив символов неправильно читает входные данные, вероятно, съел новую строку ввода. Программа работала нормально для массива int, но я все еще получаю предупреждение об отмене ссылки на указатель NULL.

Вот массив символов,

#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 работает отлично, но я все еще хочу исправить предупреждение.

В любом случае, вывод для массива char - это просто 'a' и новые строки, когда я ввожу "abc" в качестве ввода и нажимаю ввод. В качестве альтернативы я попытался ввести просто 'a' и нажать Enter, и он даже не позволяет мне ввести другие персонажи больше.

Я хочу понять, что именно не так, и хочу это исправить. В настоящее время я использую IDE VS, но я бы хотел также совместимую с gcc 6.3 версию.

Edit: ошибка, которую я получаю, находится в строке printf, и она читает-

Warning C6011 Dereferencing NULL pointer 'set+i'.

1 Ответ

2 голосов
/ 15 мая 2019

Основное различие между версией int, которая работает, и версией char, которая не работает, заключается в том, что вы используете %d и %c - и %d пропускает пробел, а %c - нет.

Измените "%c" на " %c", и у вас будет шанс на победу.

Три scanf() - или scanf_s(), если вы работаете в Windows - преобразования не пропускают пробелы. Это %c, %[…] (наборы сканирования) и %n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...