2015-10-05 59 views
0

我遇到问题。计数句子字符

我想制作一个计算一个句子中元音数量的程序。

要做到这一点,我使用strlen来计算一个句子中的字母数量 ,但问题是,为什么它只计算第一个单词。

我需要一个句子中的字符数循环程序来查找句子中每个单词中的元音。

如何统计一个句子中的所有字符?

应该使用哪个命令?

我用C语言

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

int main() 
{ 
    int input; 

    int repeater; 
    scanf("%d",&input); 
    int counter[input]; 
    getchar(); 
    char kalimat[100000]; 
    scanf("%s",kalimat); 
    for(int i=1;i<=input;i++) 
    { 
     counter[i]=0; 
    } 
    repeater=strlen(kalimat); 
    for(int i=1;i<=input;i++) 
    { 
     for(int j=i;j<=repeater;j++) 
     { 
      if(kalimat[j]=='A'||kalimat[j]=='a'||kalimat[j]=='E'||kalimat[j]=='e'||kalimat[j]=='I'||kalimat[j]=='i'||kalimat[j]=='O'||kalimat[j]=='o'||kalimat[j]=='U'||kalimat[j]=='u') 
      { 
       counter[i]++; 
      } 
     } 

    } 
+2

你知道'switch'吗? 'char kalimat [100000]'不是一个好主意,它仍然不安全,它足够'char kalimat [100]; scanf(“%99 [^ \ n]”,kalimat)'。 –

+0

你也忘了'y',这有时是一个元音... –

+2

C中的数组不是从0开始索引的? – PatJ

回答

5

scanf只抓住了,直到第一个空间。您需要将模式传递给接受空格的scanf。尝试用"%[^\n]"替换"%s"

+2

转换中的反斜杠是什么?不应该是'“[^ \ n]”'? – EOF

+0

@EOF好抓!我输错了。我编辑了答案来澄清这一点。谢谢! – Kagetsuki

0
  1. 如果您使用“%s”作为引发器,scanf只会计入第一个spacer。

  2. char kalimat [100000];是丑陋的,丑陋的编码,仍然不安全溢出。只要限制你可以输入的字符数为200左右。

  3. 字符串索引从0开始,所以你的i计数器也应该。

0

%s转换指定告诉scanf读取直到下一个空白字符;它不会读取用空格分隔的多个单词。

比较安全的做法是

if (!fgets(kalimat, sizeof kalimat, stdin)) 
{ 
    // error on input, handle as appropriate 
} 
else 
{ 
    // process kalimat 
} 

要知道,fgets将其后的换行符存储到kalimat如果有空间。对于汽车阵列来说,10千字节有点大。

0

请尝试此操作,根据需要扩展到其他字母,'Y'也许。

#include <string.h> 
int main() 
{ 
    int i = 0; 
    int counter = 0; 
    char c; 
    char kalimat[100000]; 

    printf("\n please enter text\n"); 
    fgets(kalimat, 100000, stdin); 

for (i = 0; i < strlen(kalimat); i++) 
{ 
    c = toupper(kalimat[i]); 
    if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') 
    counter++; 
} 
printf("\n I counted %d vowels ", counter); 
getchar(); 
}