Итерация строки переменной длины в C - PullRequest
1 голос
/ 01 марта 2020

Итерация по строке фиксированной длины проста, но когда используется строка переменной длины, итерация завершается с ошибкой после 0-го индекса.

Например, в приведенном ниже коде (печать символов строка p одна за другой), использование p[] не работает, в то время как p[some integer] работает (но мы не всегда знаем, что это за some integer).

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

int main(void) {
    setbuf(stdout, NULL);

    // variable p to store string
    // if you change the line to let's say char p[20]=""; it will work
    char p[]="";
    printf("Enter a string: ");
    scanf("%s", p);

    printf("You entered: %s\n", p);
    printf("String length: %d\n", strlen(p));

    printf("Printing each character of the string:\n");
    int i=0;
    while (p[i] != '\0')
    {
        printf("p[%d] is %c\n", i, p[i]);
        i++;
    }

    return 0;
}

Ответы [ 2 ]

3 голосов
/ 01 марта 2020

Когда массиву не присвоен начальный размер, он становится достаточно большим, чтобы содержать то, с чем он инициализируется. В этом случае вы инициализируете массив char пустой строкой "". Эта строковая константа состоит из одного нулевого байта, поэтому p - это массив размером 1.

Затем, когда вы пытаетесь прочитать строку в нее, вы пишете после конца массива, вызывая неопределенное поведение .

1 голос
/ 01 марта 2020

Если мы опускаем измерение массива, компилятор вычисляет его для нас на основе размера инициализатора.

В этом выражении:

char p[]="";

инициализатор представляет собой пустой строковый литерал (строка литерал только с символом '\0'). Таким образом, размер char массива p будет 1.
Доступ к массиву сверх его размера равен неопределенное поведение . Неопределенное поведение включает в себя то, что оно может выполняться некорректно (либо аварийно завершать работу, либо молча генерировать неверные результаты), либо случайно выполнять то, что задумал программист.

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