奇怪的结果#1-13 C编程语言书
K&R的《C编程语言》一书中的问题1-13要求读者创建一个程序,该程序将按长度绘制单词的直方图。文字由用户输入 我试着创建一个程序来存储每个长度的单词数量,然后在处理直方图之前打印出每个数组块的int值。无论我如何摆弄这个程序,它总会给我两个结果中的一个;要么是“1”,要么就是我假设的数组地址?"6422476". 为什么会这样奇怪的结果#1-13 C编程语言书,c,C,K&R的《C编程语言》一书中的问题1-13要求读者创建一个程序,该程序将按长度绘制单词的直方图。文字由用户输入 我试着创建一个程序来存储每个长度的单词数量,然后在处理直方图之前打印出每个数组块的int值。无论我如何摆弄这个程序,它总会给我两个结果中的一个;要么是“1”,要么就是我假设的数组地址?"6422476". 为什么会这样 #include <stdio.h> #define GREATEST 10 int main(void){ int c, word=0;
#include <stdio.h>
#define GREATEST 10
int main(void){
int c, word=0;
int word_count[GREATEST];
/*set all values in word_count to 0*/
for(int i=0; i<GREATEST; i++){
word_count[i]=0;
}
while((c=getchar()) != EOF){
if(c != ' '){
++word;
} else{
word_count[word-1]=+1;
word=0;
}
}
for(int j=0; j<GREATEST; j++){
printf("\n%d", word_count[j]);
}
return 0;
}
#包括
#定义最大的10个
内部主(空){
int c,word=0;
整数字计数[最大值];
/*将word_count中的所有值设置为0*/
对于(inti=0;i有一个很好的理由可以解释为什么你总是得到1
word_count[word-1]=+1; // This assigns to the value "+1"!`
应该是
word_count[word-1]+=1; // This increments your array item`
在C:)中编译的东西是一个错误。我用正确的+=
或“不正确的”=+
运行了您的代码,两者都给出了相同的输出:
a bb bb ccc ccc ccc dddd dddd dddd dddd qwertyuiop eeeee
1 2 3 4 0 0 0 0 0 1
a bb bb ccc ccc ccc dddd dddd dddd dddd qwertyuiop eeeee
1 2 3 4 0 0 0 0 0 1
但是,对于5个字符长的单词,两人都放弃了最后输入的单词-0。我认为这是因为您在EOF
上退出while循环,例如ctrl+D
,并且自最后一个空格'
以来输入的任何内容都不会被处理
此外,如果用户在多行上输入“单词”或由空格分隔的“单词”组,则结果不正确。这些输入单词的“选项”使一致处理输入变得更加困难
您最好指示用户一次输入一个单词,并拒绝包含空格的输入。
这使得控制输入和处理输入的所有单词变得更容易
下面是使用缓冲区保存输入的输入代码片段。
缓冲区大小、直方图数组和允许的最大字长都是使用静态变量maxlen
设置的
/* tell user what to enter */
printf("Type one word at a time (hit enter after each word)\nType 99 to finish\n");
/* get lines of input */
while ((fgets(buff, maxlen ,stdin)) != NULL) {
/* test for '99' end code */
if(strncmp(buff, "99", 2) == 0) break;
/* test for any spaces in input -if so ignore input & print message */
if(strstr(buff, " ") != NULL ) {
printf("Enter one word at a time - then hit enter\n");
} else {
/* else get size of word (-1 for newline) & increment appropriate counter */
length = strlen(buff) - 1;
hist[length]++;
}
}
缓冲区是这样设置的
char *buff = malloc(maxlen + 1);
并且必须在输入完成后释放
free(buff);
=+
曾是古代C语言中的一个运算符!而且,这些运算符也可以像+=
中那样用空格书写。请参见此处:引用:“在B和早期的C中,运算符的拼写是=+而不是+=;这个错误在1976年修复,是由B的词法分析器中处理第一个形式的一种非常简单的方法引起的。”直接来自Dennis Ritchie。1)只需执行int word_count[grest]={0};
2)word count[word-1]即可摆脱第一个循环+=1;
会给你带来麻烦,如果word
等于0
,比如说如果输入的第一个字符是空格;3)你永远不会计算最后一个单词;4)你会在字数中包括换行符、句点和其他非字母字符。@Paul Griffiths我唯一的问题是关于你的第三点,对吗(int j=0;j循环打印柱状图,它与计算单词数无关。您只在遇到空格时计算单词数。除非您读取的最后一个字符是空格,word\u count[word-1]+=1;
不会对最后一个单词执行,因此它不会被计算。