20
2012-05-01 05:12:06
0
우왕 댓글 많이 달렸네요...
음.. 질문 작성자가 나름 고민 많이 하신 것 같은데,저라면 이렇게 짤 거에요.
각 배열의 인덱스는 영대문자, 영소문자, 숫자, 공백의 순서와 매치시키고,
각 배열의 값은 문자열에서 출현한 순서를 기록하도록 합니다.
이건 위 댓글의 컨셉과 비슷할겁니다. 하지만 위 소스들은 가독성이 무척 떨어지네요.
참고로 gets 쓰지 마세요. 기억장소의 끝을 검사하지 않아 좋지 않습니다.
코딩에서 아주 중요한 사항 중 하나는, 프로그램이 실행되는 논리가 눈에 잘 보여야 한다는 겁니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define LINE_MAX 255
void char_count(const char* str, const int str_len);
int main(int argc, char** argv)
{
char str[LINE_MAX];
int str_len;
fgets(str, LINE_MAX, stdin);
str_len = strlen(str);
char_count(str, str_len);
return EXIT_SUCCESS;
}
void char_count(const char* str, const int str_len)
{
int upper_slot[26] = {0, };
int lower_slot[26] = {0, };
int num_slot[10] = {0, };
int white_slot[1] = {0};
int idx;
int i;
for(i = 0; i < str_len; ++i)
{
if(isupper(str[i]))
{
idx = str[i] - 'A';
++upper_slot[idx];
}
else if(islower(str[i]))
{
idx = str[i] - 'a';
++lower_slot[idx];
}
else if(isdigit(str[i]))
{
idx = str[i] - '0';
++num_slot[idx];
}
else if(str[i] == ' ')
{
++white_slot[0];
}
}
for(i = 0; i < 26; ++i)
if(upper_slot[i] != 0)
printf("%c(%d) ", 'A' + i, upper_slot[i]);
for(i = 0; i < 26; ++i)
if(lower_slot[i] != 0)
printf("%c(%d) ", 'a' + i, lower_slot[i]);
for(i = 0; i < 10; ++i)
if(num_slot[i] != 0)
printf("%c(%d) ", '0' + i, num_slot[i]);
for(i = 0; i < 1; ++i)
if(white_slot[i] != 0)
printf("<blank>(%d) ", white_slot[i]);
putchar('n');
}