Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的结果#1-13 C编程语言书_C - Fatal编程技术网

奇怪的结果#1-13 C编程语言书

奇怪的结果#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;

K&R的《C编程语言》一书中的问题1-13要求读者创建一个程序,该程序将按长度绘制单词的直方图。文字由用户输入

我试着创建一个程序来存储每个长度的单词数量,然后在处理直方图之前打印出每个数组块的int值。无论我如何摆弄这个程序,它总会给我两个结果中的一个;要么是“1”,要么就是我假设的数组地址?"6422476". 为什么会这样

#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;
不会对最后一个单词执行,因此它不会被计算。