@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
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Ну, начать на до с того, что вот так:
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 в предыдущий цикл. Вы же должны пропустить символы до перевода строки только если строка слишком длинная.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы