2016-11-13 18 views
1

文字列の中の文字を置き換えるコードを書こうとしています。ユーザーは文字を選択します。例:とaを選択した場合、出力はlandanになるはずです(文字列london)。ここで文字の置換とCの置換

はコードです:

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

#define MAXLEN 100 

int function2(char str[], char drop, char sub) { 
    int i = 0; int num = 0; 
    while (str != NULL) { 
     if (str[i] == drop) { 
      str[i] = sub; 
      num++; 
     } 
     i++; 
    } 
    return num; 
} 

int main() { 
    char d, s; 
    char my_string[MAXLEN]; 

    printf("Input your string\n"); 
    scanf("%s", &my_string); 
    printf("Input character you want to drop\n"); 
    scanf(" %c", &d); 
    printf("Now character you want to substitute\n"); 
    scanf(" %c", &s); 
    function2(my_string, d, s); 
    printf("The string is %s\n", my_string); 
    return EXIT_SUCCESS; 
} 

それはあなたが実際に変更された文字列を印刷する時点まで動作します。私が得るものはすべてです。関数のコードは私のものではありませんでした(私はいくつかのウェブサイトでそれを見つけましたので、function2の元のコードの所有者です - ありがとうございます)。どんな助けもありがとう!

+1

'{':ここ

修正されたバージョンです。 '#include ' – BLUEPIXY

+0

@BLUEPIXY:なぜ ' 'が必要でしょうか? ''も必要ではなく、 'NULL 'は多くの標準ヘッダの中で' 'に定義されています。 – chqrlie

+0

@ EXIT_SUCCESSのための@chqrlie – BLUEPIXY

答えて

1

まず、scanfの使用を避けるべきです。理由と選択肢に興味がある場合はhereをクリックしてください。ポインタがNULL

while(str[i] != '\0') 

はトリックを行う必要になることはありませんので、

しかし、戻ってあなたの問題に

while(str != NULL) 

は、無限ループです。文字列の最後にすでに到着しているかどうかを毎回チェックします。

+0

完璧に作業しました! ありがとう – Egor

0
if (str != null){ 
     while(str[i] != '\0'){ 
     if (str[i] == drop){ 
      str[i] = sub; 
      num++; 
     } 
     i++; 
     } 
    } 

strがstr != NULLとchar配列、である、あなたは、有効なメモリアドレスにその配列ポイントを確認してください。 whileループとi ++では、文字列が '\ 0'で終わるので、配列内のすべての文字をループします。ループを終了するには、while(str[i] != '\0')でループを停止する必要があります。 strNULLになることはありませんので、

0

あなたの関数が無限ループを実行しますが、iがインクリメントされているので、str[i]は、最終的には、文字列の末尾を超えてSegmentation faultの原因となるいくつかの時点無効なメモリでメモリにアクセスします。

my_stringに読み込む最大文字数をscanf()にするのは簡単ではないことにも注意してください。 fgets()を使用するとずっと安全になり、フレーズ全体を置き換えることができます。 - > `` {(STR [I])一方、(!STR = NULL)一方

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

#define MAXLEN 100 

int function2(char str[], char drop, char sub) { 
    int num = 0; 
    for (int i = 0; str[i] != '\0'; i++) { 
     if (str[i] == drop) { 
      str[i] = sub; 
      num++; 
     } 
    } 
    return num; 
} 

int main(void) { 
    char d, s; 
    char my_string[MAXLEN]; 

    printf("Input your string\n"); 
    if (!fgets(my_string, MAXLEN, stdin)) 
     return EXIT_FAILURE; 
    printf("Input character you want to drop\n"); 
    if (scanf(" %c", &d) != 1) 
     return EXIT_FAILURE; 
    printf("Now character you want to substitute\n"); 
    if (scanf(" %c", &s) != 1) 
     return EXIT_FAILURE; 
    function2(my_string, d, s); 
    printf("The modified string is %s", my_string); 
    return EXIT_SUCCESS; 
}