未能检测到长字符串字符值
Failing to detect long string character values
我正在尝试检测字符串中出现了多少次 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);
}
输入缓冲区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 标准不允许这种行为。
我正在尝试检测字符串中出现了多少次 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);
}
输入缓冲区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 标准不允许这种行为。