【问题标题】:Failing to detect long string character values未能检测到长字符串字符值
【发布时间】:2020-02-13 20:04:20
【问题描述】:

我正在尝试检测字符串中出现了多少次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);
}

【问题讨论】:

  • 多长时间?您的变量仅足以容纳 9 个字符。如果你输入更多,你会得到未定义的行为。
  • fflush(stdin); 导致未定义的行为。 fflush 函数只为输出流定义
  • 关于:fflush(stdin); 这不是一个有效的声明。建议:int ch; while( ( ch = getchar() ) != EOF &amp;&amp; ch != '\n' ){;}
  • 关于; char c[10]; scanf("%s", &amp;c); 1) 始终检查来自scanf() 的返回值,以确保操作成功。在当前场景中,返回的任何值(除 1 外)都表示发生了错误。 2) 当使用'输入格式转换说明符:%s 和/或%[...] 总是包含一个比输入缓冲区长度小一的 MAX CHARACTERS 修饰符,因为这些说明符总是将 NUL 字节附加到输入跨度>
  • 关于:scanf("%d", &amp;n); ... char c[10]; 使用 C 的可变长度数组 (VLA) 功能要好得多。因此建议:if( scanf("%d", &amp;n) != 1) { fprintf( stderr, "scanf for length of array failed\n" ); exit( EXIT_FAILURE ); } char c[n+1]; +1 为尾随 NUL 字节留出空间

标签: c string scanf gets


【解决方案1】:

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

  • 使用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 标准不容忍这种行为。

【讨论】:

  • 非常感谢它的工作。我是新来的……便携是什么意思? fflush 的工作是什么?
  • fflush() 强制将缓冲输出写入输出流的关联文件或设备。 fflush() 在使用未打开输出的流调用时具有未定义的行为。一些系统将行为定义为丢弃待处理的输入,但 C 标准不容忍这种行为,因此在不同的机器上编译可能会产生意外的行为。
  • 这里的“可移植”是指程序在不同的机器和不同的编译器上运行是一样的。
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
相关资源
最近更新 更多