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