我试图比较字符串文字,我想删除重复的文字,我想这样做而不使用POINTERS。,

时间:2016-03-15 09:14:56

标签: c

我正在尝试比较字符串文字,我想删除重复的文字而不使用POINTERS。

这是我的代码:

char str[30];

printf("Enter strings : ");     

fgets(str,29,stdin);

char tem[30];

int count , county;

for(count = 0 ; count < strlen(str)-1 ; count++) {      
    for(county = 1 ; county < strlen(str) ; county++) {
        if(str[count] != str[county]) {
               tem[count] = str[count];     
        }
    } 
}

//PRINT

for(count = 0 ;count < strlen(str) -1 ; count++) {

    printf("%c",tem[count]);

}

输入:happen
预期输出:hapen

2 个答案:

答案 0 :(得分:4)

更正您的代码:

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

int main()
{
    char str[30];

    printf("Enter strings : ");

    fgets(str,30,stdin);

    char tem[30];

    size_t count;
    size_t county=0;;

    for(count = 0 ; count < strlen(str)-1 ; count++) {
            if(str[count] != str[count+1]) {
                   tem[county++] = str[count];
            }
    }

    tem[county] = '\0';

    printf("%s\n", tem);

    return 0;
}

请注意,如果此字符在sting中有+1位移,则此代码会删除双字符。

修改

mspi作为输入字符串mississippi

的输出
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

int main()
{
    char str[30];

    printf("Enter strings : ");

    fgets(str,30,stdin);

    char tem[30];

    size_t count;
    size_t county;
    size_t tem_index = 0;
    size_t size_of_string = strlen(str);
    bool found;

    for(count = 0 ; count < size_of_string-1; count++)
    {
        found = false;
        county = count+1;

        while ((found == false) && (county<size_of_string))
        {
            if(str[count] == str[county])
            {
                found = true;
            }
            county++;
        }

        if (found == false)
        {
            tem[tem_index++] = str[count];
        }
    }

    tem[tem_index] = '\0';

    printf("%s\n", tem);

    return 0;
}

编辑2

misp作为输入字符串mississippi

的输出
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

int main()
{
    char str[30];

    printf("Enter strings : ");

    fgets(str,30,stdin);

    char tem[30];

    size_t count;
    size_t county;
    size_t tem_index = 0;
    size_t size_of_string = strlen(str);
    bool found;

    for(count = 0 ; count < size_of_string-1; count++)
    {
        found = false;
        county = 0;

        while ((found == false) && (county<tem_index))
        {
            if(str[count] == tem[county])
            {
                found = true;
            }
            county++;
        }

        if (found == false)
        {
            tem[tem_index++] = str[count];
        }
    }

    tem[tem_index] = '\0';

    printf("%s\n", tem);

    return 0;
}

请注意,所有这些解决方案都区分大小写。

答案 1 :(得分:1)

你删除allduplicates的代码还没有完成:

  • 您对新字符串和旧字符串使用相同的索引,但是您需要两个不同的索引,因为新字符串与旧字符串一样长或短。如果旧字符串是&#34; aaab&#34;,当您看到&#34; b&#34;时,旧字符串的索引为3,但新字符串的索引仅为1.(跳过索引你在字符串中留下未初始化的空白。)

  • 您期待找到同一个字母的其他匹配项,但是对于每个没有字母的字母,您都会附加到新字符串中。您必须查看以下所有字母,但必须只附加一次新字符串。也就是说,您必须根据您在循环中找到的信息,在循环后决定该字母是否重复。

  • 当你向前看的时候,你不应该开始1,而是在他当前的信之后的那封信上。如果从一开始,你会发现第一个字母后面的每个字母都有重复,因为你自己检查每个字母。

  • 这不是一个恐怖,但在循环中反复调用strlen并不是一个好主意。输入字符串的长度不会改变,因此您可以预先确定字符串长度。如果您只想将它​​用作终止条件,则可以测试当前字母是否为空终止符。

下面是一个使用你的逻辑的解决方案,虽然是向后看,而不是前进。 (如果你期待,你会复制一封信的最后一次出现,如果你回头看,你会复制第一次出现。这可能会对字母的顺序产生影响。对于密西西比州,你是&#39;得到&#34; Mspi&#34;或&#34; Misp&#34;取决于您使用的策略。)

程序会覆盖相同的字符串。这是可能的,因为您要过滤掉字母,新索引等于旧索引或更小:

#include <stdlib.h>
#include <stdio.h>

void remdup(char *str)
{
    int i = 0;      // index into old string
    int j = 0;      // index into new string

    for (i = 0; str[i]; i++) {
        int k = 0;
        int dup = 0;

        for (k = 0; k < i; k++) {
            if (str[i] == str[k]) {
                dup = 1;
                break;
            }
        }

        if (dup == 0) str[j++] = str[i];
    }

    str[j] = '\0';
}

int main()
{
    char str[] = "Mississippi";

    puts(str);
    remdup(str);
    puts(str);

    return 0;
}

此解决方案不适用于大字符串。一种更有效的方法是保留一个表格,其中已经使用了256个可能的字符中的哪一个。