字符串操作(具有相同输入的变量输出)

时间:2018-05-23 21:16:16

标签: c string function

也许某些财产没有被注意到我,但是当我'我'是1它只是冻结。当我输入任何字符串时,' j'变量在不同的执行中变为700或2000。如果您输入" cheese"输出应该是" eee"。我做错了什么?

    #include <stdio.h>
    char * repeticoes(char *s) {
        int index = 0;

        for (int i = 0;( s[i] != '\0'); i++) //problem starts when i is > 0
        {
            for (int j = 0; ( s[j] != '\0'); j++)
            {
                if (s[i] == s[j])
                {
                    printf("%c == %c\ni %d  j %d\n", s[i], s[j],i,j);
                    s[index++] = s[i];

                }
                else
                {
                    printf("not happening %c != %c\ni %d  j %d\n", s[i],s[j],i,j);
                }
            }

        }

        s[++index] = '\0';
        return s;
    }

    main() {
        char input[21];

        printf("str 1\n");
        fgets(input, 20, stdin);
        repeticoes(input);
        printf("duplicated letters %s\n", input);

    }

2 个答案:

答案 0 :(得分:1)

你需要在外循环中处理一个字符后的下一个字符处启动内循环,否则你将处理同一对字符两次,以及在i == j时测试一个字符。

一旦找到匹配,你也应该突破内循环。您将在以后的外循环迭代中找到以后的匹配项。否则你将再次处理同一对。

在循环后分配空字符之前,不应增加index。添加重复时,它已经增加。

#include <stdio.h>
char * repeticoes(char *s) {
    int index = 0;

    for (int i = 0;( s[i] != '\0'); i++) //problem starts when i is > 0
    {
        for (int j = i+1; ( s[j] != '\0'); j++)
        {
            if (s[i] == s[j])
            {
                printf("%c == %c\ni %d  j %d\n", s[i], s[j],i,j);
                s[index++] = s[i];
                break;
            }
            else
            {
                printf("not happening %c != %c\ni %d  j %d\n", s[i],s[j],i,j);
            }
        }

    }

    s[index] = '\0';
    return s;
}

int main() {
    char input[21];

    printf("str 1\n");
    fgets(input, 20, stdin);
    repeticoes(input);
    printf("duplicated letters %s\n", input);

}

答案 1 :(得分:0)

使用要计数的字母数组和计数数组。计算完字母后,再次循环输入并设置计数大于1的字母。

#include <stdio.h>

void repeticoes ( char *s) {
    char tocount[] = "abcdefghijklmnopqrstuvwxyz";
    size_t len = sizeof tocount;
    size_t index = 0;
    int count[len];

    for (int j = 0; j < len; j++) {
        count[j] = 0;
    }

    for (int i = 0;( s[i] != '\0'); i++) {
        for (int j = 0; j < len; j++) {
            if ( s[i] == tocount[j]) {
                count[j]++;
            }
        }
    }
    for (int i = 0;( s[i] != '\0'); i++) {
        for (int j = 0; j < len; j++) {
            if ( s[i] == tocount[j] && 1 < count[j]) {
                s[index] = s[i];
                index++;
            }
        }
    }
    s[index] = '\0';
}

int main ( void) {
    char input[21];

    printf("str 1\n");
    fgets(input, 20, stdin);
    repeticoes(input);
    printf("duplicated letters %s\n", input);

    return 0;
}