Не удается обнаружить значения длинных символов строки - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь определить, сколько вхождений D и T присутствует в строке. Небольшой строковый ввод делает работу хорошо. Но более длинные строки возвращают значения мусора.

int main() {
    int r = 0, x = 0, i = 0, n;
    scanf("%d", &n);
    fflush(stdin);
    char c[10];
    scanf("%s", &c);

    for (i = 0; i <= n; i++) {
        if (c[i] == 'D')
            r++;
        if (c[i] == 'T')
            x++;
    }
    printf("%d\t", r);
    printf("%d", x);
}

1 Ответ

1 голос
/ 13 февраля 2020

Входной буфер c достаточно велик только для строки из 9 символов. Любой более длинный ввод строки вызовет неопределенное поведение, хотя может потребоваться более 10, чтобы это неопределенное поведение стало заметным для пользователя.

  • Увеличьте размер буфера и предотвратите переполнение буфера с помощью цифры c префикс int в спецификации преобразования scanf.
  • Обратите также внимание, что fflush(stdin) вообще не является переносимым *, не нужно, так как следующий scanf() пропустит ожидающий пробел в любом случае.
  • Обратите внимание, что вам следует прекратить сканирование строки, когда вы достигнете нулевого терминатора.

Вот измененная версия:

#include <stdio.h>

int main() {
    int r, x, i, n;
    char buf[256];

    if (scanf("%d", &n) == 1 && scanf("%255s", buf) == 1) {
        r = 0, x = 0;
        for (i = 0; i < n && buf[i] != '\0'; i++) {
            if (c[i] == 'D')
                r++;
            if (c[i] == 'T')
                x++;
        }
        printf("%d\t%d\n", r, x);
    }
    return 0;
}

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

...