2

在过去的两天里,我一直在到处寻找,但无法弄清楚。这是输出的一个小样本:

它应该是“并找到乐趣”:

F

工业

一个

p

休闲

=================

长度计数

=================

1 9054

2 10102

3 9336

4 5944

5 3311

6 1656

7 1292

=================

平均 2.86

=================

下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

#define DELIM " ,.;:'\"&!? -_\n\t\0"

int process(int *count, char *buffer);
int printOut(int *count);

int main() {
    char *buffer = (char *) calloc(1, 50*sizeof(char*));
    int *count =(int*) calloc(50, 50*sizeof(long));

    while (fgets(buffer, sizeof buffer, stdin)) {
        process(count, buffer);
    }

    printOut(count);
    free(count);
    return 0;
}

int process(int *count, char *buffer) {
    int word_len=0, i;
    char *pch;
    pch = strtok(buffer, DELIM);
    while (pch != NULL) {
        for(i=0; pch[i] != '\0'; i++) {
                word_len++;
        }
        count[word_len]++;
        word_len=0;
        printf("%s\n", pch);
        pch = strtok(NULL, DELIM);
    }
    return 0;
}

int printOut(int *count) {
    int i;
    double num=0;
    double total=0;
    double average=0;
    printf("================\n");
    printf("len  count\n");
    printf("================\n");
    for(i=0;i<50;i++){
        if(count[i]!=0){
            num=count[i]+num;
            total=total+(count[i]*i);
            printf("%d   %d\n",i,count[i]);
        }
    }
    average = total/num;
    printf("================\n");
    printf("average %.2f\n", average);
    printf("================\n");
    return 0;
}
4

3 回答 3

3

这是错误的:

 char *buffer = (char *) calloc(1, 50*sizeof(char*));

它应该是:

 sizeof(char) // or since this is always 1: 'calloc(1, 50)'

但真正的问题在这里:

fgets(buffer, sizeof buffer, stdin);

Sizeof 缓冲区是 4 (或任何 sizeof 指针),因为它是一个指针,你需要这样做:

fgets(buffer, 50, stdin);

此外,sizeof(long)在 calloc 调用中count也不是重点,sizeof(int)否则您可能需要分配比您打算分配更多的字节(取决于体系结构)。所以这可以是:

int *count =(int*) calloc(50, sizeof(int));
于 2013-03-06T00:33:43.220 回答
0

这个反例可能会有所帮助:

/*
 * Sample output:
 *   word= and, length(word)= 3
 *   word= find, length(word)= 4
 *   word= a, length(word)= 1
 *   word= pleasure, length(word)= 8
 *   Done.
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUF_LEN 50
#define DELIM " ,.;:'\"&!? -_\n\t\0"

void process(int *count, char *buffer);

int main() {
  char buffer[BUF_LEN];
  int count[BUF_LEN];

  strcpy (buffer, "and find a pleasure");
  process(count, buffer);

  printf ("Done.\n");
  return 0;
}

void process(int *count, char *buffer) {
  char *pch = strtok(buffer, DELIM);
  while (pch) {
    printf ("word= %s, length(word)= %d\n",
      pch, strlen(pch));
    pch = strtok (NULL, DELIM);
  }
}
于 2013-03-06T00:39:51.937 回答
0
int main() {
    char *buffer =  calloc(50, 1);
    int  *count  =  calloc(50, sizeof(int));

    while (fgets(buffer, 50, stdin)) {
        process(count, buffer);
    }

您的原始 fgets 仅“读取” sizeof 指针:4 或 8 字节,而不是输入缓冲区或 50 char ,这就是您想要的。

于 2013-03-06T00:37:21.193 回答