2013-07-20 45 views
1

我有以下代码来计算输入字符串中每个字母的出现次数。 while循环正确执行。现在我有arr[]包含'a的数量在arr[0]','b的在arr[1]等等。打印输入流中每个字母的出现

但是,以下printf不显示arr的完整内容。 (下面给出样本o/p)。

如果我完全评论while循环,printf打印所有26 arr[]值罚款! 在这个简单的程序中我可能会错过什么?

如果它的任何帮助,我使用VS 2008

int arr[26]={'\0'}; 
int i = 0, c = 0, idx = 0, count = 0; 
while((c = getchar()) != EOF) { 
    if('a' <= c && 'z' >= c) { 
    idx = c - 'a'; 
    arr[idx] = arr[idx]+1; 
    } 
} 
for(count = 0; count < 26; count++) { 
    printf("arr[%d] = %d\n", count, arr[count]); 
} 

,我得到的输出(保持不同的不同的输入):

abcxyz 
arr[0] = 1 
arr[1] = 1 
^CPress any key to continue . . . 

abcabc 
arr[0] = 2 
arr[1] 
^CPress any key to continue . . . 

@Nobilis:更新代码占大写字母,也使打印更有意义:)

int main() 
{ 
    int arr[26]={'\0'}; 
    int i = 0, c = 0, idx = 0, count = 0; 
    while((c = getchar()) != EOF) 
    { 
     if('a' <= c && 'z' >= c) 
     { 
      idx = c - 'a'; 
      arr[idx] = arr[idx]+1; 
     } 
     if('A' <= c && 'Z' >= c) 
     { 
      idx = c - 'A'; 
      arr[idx] = arr[idx]+1; 
     } 
    } 
    for(count = 0; count < 26; count++) 
    { 

     printf("%c or %c = %d\n", ('A'+count), ('a'+count), arr[count]); 
    } 
} 
+0

你的问题是不是所有的输入字符都被计算在内?我刚刚用输入'abcabc'运行你的代码,我正确地计数了:'arr [0] = 2 arr [1] = 2 arr [2] = 2'。你有没有得到任何警告(除了未使用的'我')? – Nobilis

+1

旁边: int arr [26] = {'\ 0'}; 你的代码是完全正确的。你应该在另一个地方寻找问题。 对于你的数组初始化,你正在用char初始化int。这是完全合法的C,并且工作正常,但不是你应该习惯的。 – Geod24

+0

输入字符计数正常。如果我输入为'abcxyz',我看到(使用VS调试器)arr [0],arr [1],arr [2]和arr [23],arr [24],arr [25]包含1。所有其他arr值为0.但是,当我尝试打印出来时,我得到以下不完整的输出:'abcxzy arr [0] = 1 arr [1] = 1^C按任意键继续。 。 “。 – VivereJay

回答

2

你不及格EOF正确,在Windows上是按Ctrl +ž。另外,请记住,您的算法不会考虑大写字母。

+1

添加考虑大写字母的代码,只是因为它使这个完整,并可能帮助某人! – VivereJay

6

按当你想结束输入字符时,你可以在windows上使用3210而不需要在CTRL-C上使用CTRL-Z

CTRL-C终止程序,因此没有更多的处理将发生,你将看不到输出。

+0

Rohan我使用'CTR + C'作为密钥 –

+1

@Nobilis,谢谢更新了答案。 – Rohan

+0

Unix上的CTRL-D在Windows上不能像CTRL-Z一样工作。 CTRL-D的作用是只在输入流的开头或连续两次使用输入流时结束。 http://stackoverflow.com/a/1516177/139746 –

相关问题