字符串计数字符串 - C程序

时间:2013-05-06 06:08:23

标签: c string loops

我写了一个C程序。这是一个角色计数程序。我将提供如下输入

输入:ABCAPPPRC
需要输出:A2B1C2P3R1

但它输出为A2B1C2A1P3P2P1R1C1。它基本上按照我在程序中编写的逻辑进行。但是我不想计算已经计算过的字符串的字符。你能说出我应该为此实施什么逻辑吗?

#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 个答案:

答案 0 :(得分:4)

您需要将计数与打印分开。

  1. 第一个循环遍历输入并计算每个字符的出现次数,将计数存储在由字符代码索引的数组中。
  2. 第二个循环遍历计数数组并打印对应于非零计数的字符,然后计数。
  3. 例如:

    #include <stdio.h>
    
    int main(void)
    {
        char str[] = "ABCAPPPRC";
        int counts[256] = { 0 };
    
        puts(str);
    
        for (char *ptr = str; *ptr != '\0'; ptr++)
            counts[(unsigned char)*ptr]++;
        for (int i = 0; i < 256; i++)
        {
            if (counts[i] != 0)
                printf("%c%d", i, counts[i]);
        }
        putchar('\n');
        return(0);
    }
    

    示例输出:

    ABCAPPPRC
    A2B1C2P3R1
    

      

    我无法理解第一个for循环。你能解释一下吗?

    for控制行一次遍历字符串str一个字符。它是原始代码中外部for循环的while循环等效项。

    char *ptr = str;
    ...
    while (*ptr != '\0')
    {
        ...
        ptr++;
    }
    

    循环体将*ptr(普通char)转换为unsigned char(以保证其为正),然后将该值用作索引数组counts。因此,例如,在第一次迭代中,A被映射到65,并且counts[65]递增。因此,对于每个字符代码,每次在字符串中遇到字符时,循环都会增加与该字符代码对应的计数。

    第二个循环然后选出非零计数,将字符代码打印为字符,然后计数。

    (顺便提一下,您应该从原始char *ptr = &str收到关于char *char (*)[30]之间类型不匹配的编译警告。了解何时在数组名称前添加&符号 - 除非在数组名称后面还有一个下标,否则你很少这样做。因此,&array通常 - 但并非总是 - 错误;相反,&array[0]通常是有效的。另请注意,在某些机器上,NULL被定义为((void *)0),当您将其与普通char进行比较时会发出警告,就像使用while (*ptr != NULL)时一样。您应该将字符与{{1}进行比较在我的重写中;你应该保留'\0'以便与指针一起使用。)

答案 1 :(得分:1)

str是一个字符指针,所以当你这样做时:char *ptr= &str你将指向字符的指针转换为char*。松开&符号(&)。

同样在内循环中,您应该检查是否已经处理了ch的给定值。如果您在ptr指向第二个A时使用,您应该继续,因为您已经在答案中添加了A - s的数量。

您的解决方案远非最佳。我强烈建议您查找计算排序。它将使您的解决方案更快,但也会使其更简单。

答案 2 :(得分: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;
    }

答案 3 :(得分: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;
}