未能检测到长字符串字符值

Failing to detect long string character values

我正在尝试检测字符串中出现了多少次 DT。小字符串输入工作正常。但是更长的字符串返回垃圾值。

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);
}

输入缓冲区c只够容纳9个字符的字符串。任何更长的字符串输入都会导致未定义的行为,尽管这种未定义的行为可能需要超过 10 次才能引起用户注意。

  • scanf 转换规范中使用数字前缀增大缓冲区并防止缓冲区溢出。
  • 另请注意,fflush(stdin) 根本不可移植*,不需要它,因为下一个 scanf() 将跳过挂起的白色 space 无论如何。
  • 另请注意,到达空终止符时应停止扫描字符串。

这是修改后的版本:

#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] != '[=10=]'; i++) {
            if (c[i] == 'D')
                r++;
            if (c[i] == 'T')
                x++;
        }
        printf("%d\t%d\n", r, x);
    }
    return 0;
}

*fflush() 强制将缓冲输出写入输出流的关联文件或设备。 fflush() 在使用未打开输出的流调用时具有未定义的行为。一些系统将行为定义为丢弃挂起的输入,但 C 标准不允许这种行为。