#include <stdio.h>
int main (void) {
FILE *fp;
fp = fopen("test.txt", "r");
int char_counter, i, c;
int word_length[12];
char_counter = 0;
for (i = 0; i <= 12; i++) {
word_length[i] = 0;
}
while ((c = getc(fp)) != EOF) {
if (c == '\n' || c == '\t' || c == ' ')
{
word_length[char_counter] = word_length[char_counter] + 1;
char_counter = 0;
}
else {
++char_counter;
}
}
for (i = 0; i <= 12; i++) {
printf("%d %d\n", i, word_length[i]);
}
return 0;
}
test.txt:
blahblahblah blahblah blah bla bl b b
输出:
0 0
1 1
2 1
3 1
4 1
5 0
6 0
7 0
8 1
9 0
10 0
11 0
12 -1 <-- ??
预期输出看起来相同但第12行应该有1而不是-1。我真的不明白我是怎么得到一个负数。
答案 0 :(得分:2)
代码
int word_length[12];
表示列表中有12个项目编号为0 .. 11
尝试访问第12项时,您会得到未定义的行为。
答案 1 :(得分:1)
看看这个snippt:
int word_length[12];
char_counter = 0;
for (i = 0; i <= 12; i++) {
word_length[i] = 0;
}
你找到了这个bug吗?提示:再次检查号码12
和运营商<=
。
答案 2 :(得分:0)
您的int word_length[12];
表示它可以存储0到11的最大12
个int号,
因此,word_length[12]
无法访问,因此它会给出一些垃圾值。
您需要执行int word_length[13];
,您的问题才能得到解决。
答案 3 :(得分:0)
KnR练习1-3
#include #define TAB_STOP 8 #define MAX_WORD_TABS 4 #define MAX_WORD MAX_WORD_TABS * TAB_STOP int main() { int c, i, is_first = 1, skip_space = 1, skip_tab = 0; long word_c = 0, word_l = 0; while ((c = getchar()) != EOF) { if (c != ' ' && c != '\t' && c != '\n') { word_l++; skip_space = 0; if (is_first) { ++word_c; is_first = 0; } putchar(c); } else { is_first = 0; if (!skip_space) { if (word_l 0; --word_l) printf("|||||"); //putchar('|'); putchar('\n'); skip_space = 1; } } } }
您可以在UNIX上使用重定向(&lt;,&gt;或&gt;&gt;)来输入和输出程序...无需文件处理。