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;
}
答案 0 :(得分:1)
请勿使用65
和97
等幻数。请改用字符'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
数组
您需要将字符减去a
或A
的ascii值,具体取决于它是小写的还是大写的(97 or 65)
才能获得它[&1;}。 s基值。
基值是指它从a
或A
一些输入:尝试使用 hashmap
始终使用像strlen
这样的字符串函数来帮助你做预定义的事情。