字符计数程序,字符作为int问题

时间:2016-03-05 15:42:27

标签: c arrays for-loop char integer

if语句永远不会触发,因此所有值在第二个for循环中打印为0。

#include <stdio.h>

int main()
{
    char string[100] = "this is A TEST";
    int count[26] = {0};
    int i = 0;

    for(i = 0; string[i] != '\0'; i++){
        if((string[i] + '0') == (i + 97) || (string[i] + '0') == (i + 65)){
            count[i]++;     
        } 
    }

    for(i = 0; i < 26; i++){
        printf("%c: %d \t", i+97, count[i]);

    }

    return 0;
}

4 个答案:

答案 0 :(得分:1)

请勿使用6597等幻数。请改用字符'A''a'。如果它是一封信,你必须测试每个char c。如果字母是大写的,则字母表中的字符数为c-'A',如果字母为小写,则为c-'a'

#include <stdio.h>

#define ALPHABET_SIZE ('Z'-'A'+1)

int main (void)
{
    char string[100] = "this is A TEST";
    int count[ALPHABET_SIZE] = {0};

    for ( int i = 0; string[i] != '\0'; i++ ) // for all charecters in the string
    {
        char c = string[i];
        if ( c >= 'A' && c <= 'Z' )           // test if c is uppercase letter
            count[c - 'A'] ++;
        else if ( c >= 'a' && c <= 'z' )      // test if c is lowercase letter
            count[c - 'a'] ++;
    }

    for ( int i = 0; i < ALPHABET_SIZE; i++ )
        printf( "%c: %d \t", 'a'+i, count[i] ); 

    return 0;
}

请注意,此代码适用于ASCII字符,因为'A' - 'Z''a' - 'z'会连续显示。

以下代码适用于任何字符集:

#include <stdio.h>
#include <ctype.h>  // toupper, isupper
#include <limits.h> // UCHAR_MAX 

#define NO_OF_CHAR (UCHAR_MAX+1)

int main (void)
{
    char string[100] = "this is A TEST";
    int count[ NO_OF_CHAR ] = {0};

    for ( int i = 0; string[i] != '\0'; i++ )   // for all charecters in the string      
    {
        unsigned char c = toupper( string[i] );
        count[ c ] ++;                          // increment character counter
    }

    for ( int c = 0; c < NO_OF_CHAR; c++ )
    {
        if ( count[c] > 0 && isupper( c ) )
            printf( "%c: %d \n", c, count[c] ); 
    }
    return 0;
}

答案 1 :(得分:1)

看起来你的意思是以下

#include <stdio.h>
#include <ctype.h>

int main( void ) 
{
    char string[] = "this is A TEST";
    unsigned int frequency['Z' -'A' + 1] = { 0 };

    for ( const char *p = string; *p; ++p )
    {
        char c = toupper( ( unsigned char )*p );
        if ( c >= 'A' && c <= 'Z' ) ++frequency[c-'A'];
    }

    for ( char c = 'A'; c <= 'Z'; ++c )
    {
        if ( frequency[c-'A'] ) printf( "%c: %u\t", c, frequency[c-'A'] );
    }
    printf( "\n" );
}    

程序输出

A: 1    E: 1    H: 1    I: 2    S: 3    T: 3

至于你的程序,然后启动这个if语句

if((string[i] + '0') == (i + 97) || (string[i] + '0') == (i + 65)){

没有意义。

答案 2 :(得分:1)

以下代码旨在完全符合C标准并适用于任何字符集:

#include <ctype.h>
#include <limits.h>
#include <stdio.h>

char string[] = "This is a test.";
unsigned int frequency[ UCHAR_MAX + 1 ] = { 0 };

int main( void )
{
    /* this counts ALL characters */
    for ( char *p = string; *p; p++ )
    {
        unsigned char uc = ( unsigned char ) *p;

        /* convert letters to upper case */
        uc = toupper( uc );
        ( frequency[ uc ] )++;
    }

    for ( int i = 0; i <= UCHAR_MAX; i++ )
    {
        /* output only upper-case results */
        if ( isupper( i ) )
        {
            printf( "Char: %c, frequency: %u\n",
                ( char ) i, frequency[ i ] );
        }
    }

    return( 0 );
}

答案 3 :(得分:0)

代码中有太多错误,但下面的代码片段会很好

for(i = 0; string[i] != '\0'; i++){
    if(string[i] >=97 && string[i] < 122){
        count[string[i]-97]++;     
    } 
    if(string[i] >=65 && string[i] < 91){
        count[string[i]-65]++;     
    }
}

首先检查字符串是否包含有效字符, 然后无论如何,你都要在count数组

中增加它的计数

您需要将字符减去aA的ascii值,具体取决于它是小写的还是大写的(97 or 65)才能获得它[&1;}。 s基值。 基值是指它从aA

的位移

一些输入:尝试使用 hashmap
始终使用像strlen这样的字符串函数来帮助你做预定义的事情。