0

I have written a C program. It's a character counting program. I will give input as below

Input: ABCAPPPRC
And need as output: A2B1C2P3R1.

But it gives output as A2B1C2A1P3P2P1R1C1. It basically doing as per the logic I have written in program. But I don't want to count the characters of string which have already been counted. Can you suggest what logic I should implement for this?

#include <stdio.h>

int main()
{
        char str[30]= "ABCAPPPRC";
        char strOutPut[60]="";
        char *ptr= &str, *ptr2=&str;
        char ch='A';
        int count=0;
        puts(str);

        while (*ptr !=NULL)
        {
                count =0;
                ch = *ptr;
                while (*ptr2!= NULL)
                {
                        if (*ptr2 == ch) count++;
                        ptr2++;
                }
                printf("%c%d",*ptr, count);
                ptr++;
                ptr2 = ptr;
        }
}
4

4 に答える 4

1

@ Jonathan あなたの解決策は、文字列の文字が ABCDEF のように昇順で指定された場合にのみ正しいですが、文字の順序が変更されると問題が発生します。入力文字列は「ABAPPPRCC」で、必要な出力は A2B1P3R1C2 です。この場合、ソリューションは A2B1C2P3R1 に変更されます。

以下のプログラムは、文字列の形成を変更せずに文字数を示します。

char *str= "ABAPPPRCC";
    char strOutPut[30]="";
    char *ptr = str, *ptr2 = str;  
    char ch='A';
    int count=0, i = 0 , total_print = 0;
    puts(str);

    while (*ptr != '\0')
    {
            count =0;
            ch = *ptr;
            while (*ptr2!= '\0')
            {
                    if (*ptr2 == ch) count++;
                    ptr2++;
            }
            for( i = 0; i < total_print ; i++ )
            {
                if ( ch == strOutPut[i] )
                {
                     i =  total_print + 1;
                       break;
                }
            }  

            if( i <= total_print )
            {
                    printf("%c%d",*ptr, count);
                    strOutPut[total_print++] = ch;
            }
            ptr++;
            ptr2 = ptr;
    }
于 2013-05-06T08:04:23.540 に答える
1

strはすでに文字ポインターであるため、これを行うとchar *ptr= &str、ポインターから文字へのポインターを に変換しますchar*。アンパサンド ( &) を緩めます。

また、内部サイクルでは、指定された値chがすでに処理されているかどうかを確認する必要があります。ptr が秒を指しているときに使用する場合は、回答に -sAの数を既に追加しているため、そのまま続行する必要があります。A

あなたのソリューションは最適とはほど遠いものです。検索カウント sortを強くお勧めします。これにより、ソリューションが高速化されますが、単純化されます。

于 2013-05-06T06:17:18.440 に答える
0
#include <stdio.h>

int main(void){
    const char noncountchar = '\x11';
    char str[30]= "ABCAPPPRC";
    char strOutPut[60]="";
    char *ptr, *ptr2;
    char ch;
    int count=0, len=0;
    puts(str);

    for(ptr=str;ch=*ptr;++ptr){
        if(ch == noncountchar) continue;
        count =1;
        for(ptr2=ptr+1;*ptr2;++ptr2){
            if (*ptr2 == ch){
                *ptr2 = noncountchar;
                ++count;
            }
        }
        len += sprintf(strOutPut+len, "%c%d", *ptr, count);
    }
    printf("%s", strOutPut);
    return 0;
}
于 2013-05-06T07:55:23.787 に答える