Задать вопрос
@artgor261
Студент РТУ МИРЭА

Как инициализировать массив?

Мне нужно инициализировать символьный массив символами из стандартного потока ввода. Вот мой код:

void func(char * str, int len);
int main(void)
{
    int len;
    printf("Print array's length: ");
    scanf("%d", &len);
    char str[len];
    func(str, len);
    puts(str);
}

void func(char * str, int len)
{
    char ch;
    int index;
    str[len - 1] = '\0';

    index = 0;

    while ((ch = getchar()) != '\n')
    {
        if (index < (len - 1))
        {
            str[index] = ch;
            index++;
        }
        else break;
    }
    while (index < (len - 1))
    {
        str[index] = ' ';
        index++;
    }
    while (getchar() != '\n') continue;
}


Почему содержимое массива не выводится на экран?
  • Вопрос задан
  • 83 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 1
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Ну, начать на до с того, что вот так:
int len;
    printf("Print array's length: ");
    scanf("%d", &len);
    char str[len];

массивы не обявляют. Потому что у Вас написана чушь. В строке
char str[len];
записана инструкция компилятору - выделить массив именем str и длиной из переменной len. Но в момент компиляции значение переменной len - неизвестно. Оно может быть нулем, мусором, каким угодно числом. Вам - либо задавать массив фиксированной длины, либо брать память динамически через malloc()/calloc() (лучше последний - он сразу память нулями забьет)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
А что вы вводите? Сдается мне, что ваш код ждет в цикле
while (getchar() != '\n') continue;

Это произойдет, если вы введете строку короче len-1 символов.

Чтобы это исправить, можно вставить в функцию проверку, если ch после первого цикла оказался '\n' - то второй цикл не нужен.

Или можно этот цикл вставить перед break в предыдущий цикл. Вы же должны пропустить символы до перевода строки только если строка слишком длинная.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы