Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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
C 打印输入流中每个字母的出现次数_C_Printf - Fatal编程技术网

C 打印输入流中每个字母的出现次数

C 打印输入流中每个字母的出现次数,c,printf,C,Printf,我有以下代码来计算输入字符串中每个字母的出现次数。while循环正确执行。现在我有了arr[],其中包含arr[0]中的“a”和arr[1]中的“b”的数量,依此类推 但是,以下打印F未显示下文给出的附件样品o/p的完整内容 如果我全部注释掉while循环,printf会很好地打印所有26个arr[]值! 在这个简单的程序中,我会遗漏什么 如果有任何帮助,我使用VS2008 int arr[26]={'\0'}; int i = 0, c = 0, idx = 0, count = 0; whi

我有以下代码来计算输入字符串中每个字母的出现次数。while循环正确执行。现在我有了arr[],其中包含arr[0]中的“a”和arr[1]中的“b”的数量,依此类推

但是,以下打印F未显示下文给出的附件样品o/p的完整内容

如果我全部注释掉while循环,printf会很好地打印所有26个arr[]值! 在这个简单的程序中,我会遗漏什么

如果有任何帮助,我使用VS2008

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]);
}
@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]);
    }
}
如果要结束输入字符,请在linux上按CTRL-D,在windows上按CTRL-Z,而不是按CTRL-C

CTRL-C终止程序,因此不再进行处理,您将看不到输出。

在linux上按CTRL-D,在windows上按CTRL-Z,而不是按CTRL-C结束输入字符


CTRL-C终止程序,因此不再进行处理,您将看不到输出。

您没有正确地传递EOF,在Windows上是CTRL+Z。此外,请记住,您的算法不会考虑大写字母。

您没有正确地传递EOF,在Windows上是CTRL+Z。此外,请记住,您的算法不会考虑大写字母。

您的问题是并非所有输入字符都被计算在内吗?我刚刚用输入abcabc运行了您的代码,正确地得到了计数:arr[0]=2 arr[1]=2 arr[2]=2。除了未使用的i之外,您是否收到任何警告?除了:int arr[26]={'\0'};你的代码完全正确。你应该到另一个地方去寻找这个问题。对于数组初始化,您使用char初始化int。这是完全合法的C语言,很好用,但不是你应该习惯的东西。输入的字符数很好。如果输入为'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你的输入中有^C吗?你通过EOF正确吗?在Windows上是CTRL+Z.Nobilis,你搞定了!谢谢:不是所有的输入字符都被计算在内,这是您的问题吗?我刚刚用输入abcabc运行了您的代码,正确地得到了计数:arr[0]=2 arr[1]=2 arr[2]=2。除了未使用的i之外,您是否收到任何警告?除了:int arr[26]={'\0'};你的代码完全正确。你应该到另一个地方去寻找这个问题。对于数组初始化,您使用char初始化int。这是完全合法的C语言,很好用,但不是你应该习惯的东西。输入的字符数很好。如果输入为'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你的输入中有^C吗?你通过EOF正确吗?在Windows上是CTRL+Z.Nobilis,你搞定了!谢谢:Rohan,我在Unix上使用CTR+C作为键盘CTRL-D,但在Windows上的工作方式与CTRL-Z不同。CTRL-D的作用是仅当在一行的开头或一行中使用两次输入流时,才发出输入流结束的信号。Rohan我在Unix上使用CTR+C作为键CTRL-D,但在Windows上的工作方式与CTRL-Z不同。CTRL-D的作用是仅当在一行的开头或一行中使用两次输入流时,才发出输入流结束的信号。添加了将大写字母考虑在内的代码,只是因为它使这项工作变得完整,并且可能会帮助某些人!添加了将大写字母考虑在内的代码,只是因为它使这项工作变得完整,并且可能会帮助某些人!
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]);
    }
}