0

だから私はK&Rで練習問題をやろうとしています。スクイーズに似た機能を作ってほしいのですが、何が悪いのかわかりません。すでにデスクチェックしました。ネット上で解決策を見つけたくありません。コードが機能しない理由を理解したいと思います。

//removes characters that are present in both strings
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAXLTR 15

void removesame(char s1[],char s2[]);

int main(void)
{
    char string1[MAXLTR],string2[MAXLTR];
    printf("Enter a string: ");
    scanf("\n%s",&string1);
    printf("\nEnter the letters/words to be removed: ");
    scanf("\n%s",&string2);
    removesame(string1,string2);
    printf("\nFinal output: %s",string1);
    getch();
}

void removesame(char s1[],char s2[])
{
    char temp[MAXLTR];
    int arraycntr,comparecntr;
    for(comparecntr = 0; comparecntr < MAXLTR; comparecntr++)
    {
        for(arraycntr = 0;arraycntr < MAXLTR;arraycntr++)
        {
            if(s1[arraycntr] == s2[arraycntr])
                s1[arraycntr] == '\t';
        }
    }
    comparecntr = 0;
    for(arraycntr = 0; arraycntr < MAXLTR; arraycntr++)
    {
        if(s1[arraycntr] != '\t')
        {
            temp[comparecntr] = s1[arraycntr];
            ++comparecntr;
        }
    }        
    for(arraycntr = 0; arraycntr < MAXLTR; arraycntr++)
        s1[arraycntr] = '\0';
    for(arraycntr = 0;arraycntr < MAXLTR; arraycntr++)
        s1[arraycntr] = temp[arraycntr];

}
4

1 に答える 1

3

これは割り当てではありませんが、同等性テストです。

s1[arraycntr] == '\t'; 

あなたが意味した:

s1[arraycntr] = '\t';

高い警告レベルでコンパイルすると、コンパイラはこれを警告するメッセージを出力する場合があります。Microsoft VCコンパイラは、次の警告を発します。

C:\ devel \ cpp \ stackoverflow \ main.c(32):警告C4553:'==':演算子は効果がありません。'='を意図しましたか?

最初のforループは、同じインデックスに同じ値があるかどうかs1をチェックするだけで、charinがのどこかに存在するかどうかはチェックしません。ループの終了条件も、との長さである必要があります。s2s1s2fors1s2MAXLTR

size_t arraycntr,comparecntr;
for(comparecntr = 0; comparecntr < strlen(s2); comparecntr++)
{
    for(arraycntr = 0;arraycntr < strlen(s1) ;arraycntr++)
    {
        if(s1[arraycntr] == s2[comparecntr])
            s1[arraycntr] = `\t`;
    }
}

次のforループstrlen(s1)も使用し、nullターミネータをtempafterに割り当てる必要があります。

comparecntr = 0;
for(arraycntr = 0; arraycntr < strlen(s1); arraycntr++)
{
    if(s1[arraycntr] != `\t`)
    {
        temp[comparecntr] = s1[arraycntr];
        ++comparecntr;
    }
}
temp[comparecntr] = '\0';

tempはどこにも初期化されていないため、この間に入力されたデータとは別に、ランダムなデータが含まれていますfor。にnullターミネータがないとtemps1nullターミネータもなくなります(後でガベージが印刷される可能性があります)。最後に、データを入力するstrlen(temp) + 1ときs1

for(arraycntr = 0;arraycntr < strlen(temp) + 1; arraycntr++)
    s1[arraycntr] = temp[arraycntr];

+ 1ヌルターミネータをにコピーしますs1

strlen()マイナーな注意点として、ループの終了条件を呼び出す代わりに、forこれを保存することができます。

size_t chars_to_copy;
for(arraycntr = 0, chars_to_copy = strlen(temp) + 1;
    arraycntr < chars_to_copy;
    arraycntr++)
{
    s1[arraycntr] = temp[arraycntr];
}
于 2012-06-29T10:18:26.940 に答える