C имеет дело со строкой переменной длины - PullRequest
0 голосов
/ 25 октября 2018

Я новичок в C, учусь в университете.В одной из заданий, которые мне дали, я имею дело со строками.Я беру строки, введенные пользователем или анализируемые из файла, а затем использую для них функцию для получения ответа (если существует определенное качество).

Строка может иметь переменную длину, но допустимо предположить, чточто их максимальная длина составляет 80 символов.

Я создал программу, используя

char s[81];

, а затем каждый раз заполнял один и тот же массив разными строками.Поскольку строка должна заканчиваться нулем, я просто добавил '\ 0' с индексом 80;

s[80] = '\0';

Но затем я получил все виды странного поведения - несвязанные символы в конце введенной строки,Я предположил, что это потому, что между концом «настоящих» символов и символом «\ 0», заполненным мусором (?), Было пространство.

Итак, я создал функцию:

void clean_string(char s[], int string_size) {
    int index = 0;
    while(index < string_size) {
        s[index++] = '\0';
    }
}

То, что я называю чистым, это просто заполнение строки нулевыми символами.Я делаю это каждый раз, когда заканчиваю работу со строкой и готов принять новую.Затем я снова заполняю строку символ за символом, и когда я остановлюсь, следующий символ наверняка будет \ 0.Чтобы не включать магические числа в код (81 каждый раз, когда я вызываю clean_string), я использовал следующее:

#define STRING_LENGTH 81

Это работает для меня.Строки не показывают странного поведения.Но я задавался вопросом, считается ли это плохой практикой.Есть ли проблемы с этим подходом?Просто подчеркиваю, я не прошу помощи в самом задании, но советы о том, как лучше подходить к таким ситуациям.

1 Ответ

0 голосов
/ 25 октября 2018

Вместо того, чтобы предварительно заполнять весь массив нулями, нужно просто добавить один ноль после того, как вы прочитали все соответствующие символы.

Например:

char s[STRING_LENGTH];
int c;
int idx = 0;

while (((c = getchar()) != '\n') && (idx < STRING_LENGTH - 1) && (c != EOF)) {
    s[idx++] = c;
}
s[idx] = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...