2017-04-11 46 views
0

我需要我的程序输入用户想要输入的句子数,然后输入这些句子。然后,通过传递函数letter(),我想让它计算每个字母在字符串中出现的次数。不过,我遇到了以下问题:计算一个句子的字母给出随机输出

  1. 当我输入的行数,该程序只要求用户输入1小于输入的号码(即,如果我想2句,我只提示一)。
  2. 字母计数无法正常工作。这似乎是一种随机的。

另外我想知道我是否正确使用我的二维数组(即我是否正确填充它,是否正确地将它传递给函数)。对于数组str[][],我希望第一个框表示句子数,第二个表示每行中的字符数。

这里是我的代码:

#include <stdio.h> 

void letter(int n, char str[][80]){ 
    char c = 'a'; 
    char alpha[26]; 
    int ltrcnt[26]; 

    for(int i = 0; i < 26; i++){ 
     ltrcnt[i] = 0; 
    } 

    for(int i = 0; i < 26; i++){ 
     for(int j = 0; j < 26; j++){ 
      for(int k = 0; k < 26; k++){ 
       if(str[i][j] == c){ 
        ltrcnt[k]++; 
       } 
       c++; 
      } 
     } 
    } 

    c = 'a'; 
    for(int i = 0; i < 26; i++){ 
     printf("%c: %d\n", c, ltrcnt[i]); 
     c++; 
    } 
} 

int main(void){ 
    int n; 

    printf("Enter number of lines: "); 
    scanf("%d", &n); 

    char str[n][80]; 
    printf("Enter a sentecne: "); 
    for(int i = 0; i < n; i++){ 
     fgets(str[i], 80, stdin); 
    } 

    letter(n, str); 
} 
+0

随机你的意思是你可以进入同一个句子两次,你会得到不同的结果如何? –

回答

3

第一个问题fgets()跳过一个迭代是因为的按剩余newline的输入第一个输入后关键。

一个简单的例子来清理输入缓冲器关闭换行符将

scanf("%d%*c", &n); //eat the newline. 

对于第二个问题,功能里面,你有三个嵌套循环这没有任何意义。您在任何地方都没有使用n的值。这没有任何意义,并导致垃圾输出。

例如,

  • 你限制指数j25,但实际上你要接受它是只要79
  • 你有循环变量k,这是不正确使用。

明智的循环条件是,

  • i高达n-1i<n)作为第一个指数。
  • j高达终止空,(arr[i][j]
  • k,从a开始,直到zint k = 'a'; k < ('z' + 1) ; k++)[注:此计算仅小写字母]
+0

@BLUEPIXY加入回答,谢谢。 :) –

+1

在这种情况下'ltrcnt [k] ++;' - >'ltrcnt [k -'a'] ++;' – BLUEPIXY

1

当我输入行数,程序只要求用户输入1比输入的数字少1

我猜你在做scanf时,它不会号码末尾不要吞下新线。因此,第一个fgets获得该行上剩余的(空)数字

字母计数无法正常工作。这似乎是一种随机的。

在你的循环,i应该算从0n - 1(即str行数)和j应该从0数到strlen(str[i]) - 1或更好,j应该从0数到时str[i][j] == '\0'因为strlen需要遍历通过所有的角色本身,因此效率低下。然后

你的内循环应该看到,如果str[i][j]azAZ之间,如果是,从中减去'a''A',并用其作为索引ltrcnt

而且通过“内循环” ,我的意思是j,你不需要for (k ...循环,据我所知。

如果您坚持使用k循环,请记得在每次启动之前将c重置为'a'

的最小修复的第二个问题是:

for(int i = 0; i < n; i++){ 
    for(int j = 0; str[i][j] != '\0'; j++){ 
     c = 'a'; // << was missing 
     for(int k = 0; k < 26; k++){ 
      if(str[i][j] == c){ 
       ltrcnt[k]++; 
      } 
      c++; 
     } 
    } 
} 

较好的修复,消除了内部循环是

for(int i = 0; i < n; i++){ 
    for(int j = 0; str[i][j] != '\0'; j++){ 
     if (str[i][j] >= 'a' && str[i][j] <= 'z') 
     { 
      ltrcnt[str[i][j] - 'a']++; 
     } 
    } 
} 
+0

我做出了您指出的更改,并且修复了第一个问题。但是,第二个问题仍然存在。如果我输入“你好吗”和“我的名字是鲍勃”,它表示h的数量是2,我是1,其他所有是0. –

+0

@ShoaibAhmed所以它得到了我的权利:)你的外部循环是(for =(i = 0; i JeremyP

+0

谢谢指出。我忘了在k循环之前设置c ='a',这很有道理,它导致了问题。谢谢。 –