如何在字符串C中将每个特定字符替换为另一个字符?

时间:2013-12-31 15:10:21

标签: c string loops for-loop

我在C中编程。我应该创建一个程序来识别字符串中最常见的字符是什么,以及第二个最常见的字符是什么。

我不确定为什么,但它不起作用。程序应该把它的位置放到一个整数。不是指针,但如果最常见的是str1[i],则它将整数形成i的值。所以在第二个最常见的。如果它是str1[j],则它应该将j的值放入整数。那么,它应该用最常见的第二种来代替最常见的。替换功能起作用,虽然我无法弄清楚它是什么,但循环中可能存在问题。

这就是我所拥有的(假设所有的整数和字符串都在开头声明):

void stringReplace(char str1[], char ch1, char ch2);

int main()
{
    char str1[100];
    char ch1, ch2;
    int i, j, p, n, len, counter1, counter2, first, second, times;
    printf("Please enter the string - maximum = 100 characters:\n");
    printf("User input: ");
    gets(str1);
    len = strlen(str1);
    for(i = 0 ; i < len ; i++)
    {
        counter1 = 0;
        for(j = 0 ; j < len ; j++)
        {
            if(str1[i] == str1[j])
            {
                counter1++;
            }
            if(counter1 > counter2)
            {
                first = i;
            }
        }
        counter2 = counter1;
    } //character which shows up most - found.

counter2 = 0;

    for(p = 0 ; p < len ; p++)
    {
        for(n = 0 ; n < len ; n++)
        {
            if(str1[p] == str1[n])
            {
                counter1++;
            }
            if(counter1 < first && counter1 > counter2)
            {
                second = p;
            }
        }
        counter2 = counter1;
    }

    ch1 = str1[first];
    ch2 = str1[second];
    stringReplace(str1, ch1, ch2);
    puts(str1);
    return 0;
}

void stringReplace(char str1[], char ch1, char ch2)
{
    int i, j, len;
    len = strlen(str1);
    for(i = 0 ; i <= len ; i++)
    {
        if(str1[i] == ch1)
        {
            str1[i] = ch2;
        }
    }
}

问题出在哪里?

2 个答案:

答案 0 :(得分:0)

所以你想找到一个字符串中的n个最大数字,n = 2,对吧? 我为你做了一个小工作的例子。代码与您的代码略有不同,但效果很好。

#include <stdio.h>

int main(int argc, char* argv[])
{
    char str[] = "Algorithms Are Funnnn!\0";
    int i=0;
    int offset=33;
    int ocurrs[94] = {0}; //considering from 33 to 126 (valid chars - ASCII Table [0-127]).
    int max[2]={0};

    while(str[i]) 
        ocurrs[str[i++]-offset]++;

    for(i=0; i<94; i++)
        if(ocurrs[i]>ocurrs[max[1]]){
           max[0] = max[1]; 
           max[1] = i;
        }
        else if(ocurrs[i]>ocurrs[max[0]]) 
           max[0]=i;

    printf("chars '%c'(%d times) and '%c'(%d times) occurred most.\n",
        offset+max[1], ocurrs[max[1]], offset+max[0], ocurrs[max[0]]);

    return 0;
}

另外,尽量避免获取,因为它完全不安全。 如果你想最多抓100个字符,请改用:

char buffer[100];
fgets(buffer, 100, stdin);

问候。

答案 1 :(得分:0)

无法找到一些循环的答案,没有填充的出现技术。

代码非常有趣。

#include <string.h>
#include <stdio.h>

int main( void ) {

    char szInput[] = "ONE DOES NOT SIMPLY WALK INTO MORDOR!";
    int len = strlen( szInput );

    int MaxCountSoFar_1 = 0;
    int MaxIndexSoFar_1 = -1;
    int MaxCountSoFar_2 = 0;
    int MaxIndexSoFar_2 = -1;
    int i, j, CountThatOne;

    for ( i = 0; i < len; ++i ) {
        if ( szInput[ i ] == ' ' ) continue;
        // count that char
        CountThatOne = 1;
        // don't start from 0, they are already "counted"
        for ( j = i + 1; j < len; ++j ) {
            if ( szInput[ i ] == szInput[ j ] ) ++CountThatOne;
        }
        if ( CountThatOne > MaxCountSoFar_1 ) {
            // push old first max to new second max
            MaxCountSoFar_2 = MaxCountSoFar_1;
            MaxIndexSoFar_2 = MaxIndexSoFar_1;
            // new first max
            MaxCountSoFar_1 = CountThatOne;
            MaxIndexSoFar_1 = i;
        } else {
            // catch second one, but not if equal to first
            if ( CountThatOne > MaxCountSoFar_2 && szInput[ i ] != szInput[ MaxIndexSoFar_1 ] ) {
                MaxCountSoFar_2 = CountThatOne;
                MaxIndexSoFar_2 = i;
            }
        }
    }
    if ( MaxIndexSoFar_1 >= 0 ) {
        printf( "Most seen char is %c, first seen at index %d\n", szInput[ MaxIndexSoFar_1 ], MaxIndexSoFar_1 );
        if ( MaxIndexSoFar_2 >= 0 ) {
            printf( "Second Most seen char is %c, first seen at index %d\n", szInput[ MaxIndexSoFar_2 ], MaxIndexSoFar_2 );
        }
    }
    return 0;

}