2016-10-17 7 views
0

文字列の文字を置き換えるプログラムを作成しました。エラーはありませんが、出力は期待どおりではありません。それで私を助けてください。Cで別の文字に置き換えるプログラム

#define _CRT_SECURE_NO_DEPRECATE 
#include<stdio.h> 
#include<string.h> 
void replace(char s,char d); 
char a[100]; 
int main() 
{ 
    char b,r; 
    printf("enter the string\n:"); 
    gets(a); 
    printf("enter the the letter to be replaced\n:"); 
    scanf("%c", &b); 
    printf("enter the letter to be replaced with\n:"); 
    scanf("%c", &r); 
    replace(b,r); 
} 
void replace(char s, char d) 
{ 
    int i,f=0; 
    for (i = 0; a[i] != '\0'; i++) 
    { 
     if (a[i] == s) 
     { 
      a[i] = d; 
      f = 1; 
     } 
    } 
    if (f == 0) 
    { 
     printf("letter not found"); 
    } 
} 

出力

enter the string 
:hello every one 
enter the the letter to be replaced 
:e 
enter the letter to be replaced with 
:letter not found 

私はOで電子を交換したかったが、私は

UPDATE にこのループを使用することを交換する単語の入力を与えることができないのですscanf を使用しているときに入力バッファの問題を取り除いてください。しかし、私のプログラムにそれを実装する方法がわかりませんhel P

void 
clear(void) 
    {  
    while (getchar() != '\n') 
     ; 
    } 
+2

'scanf("%c "、&r)'は実際には改行を指すstdinで呼び出されます。行の終わりまで正しく読み込む方法の詳細については、http://stackoverflow.com/q/7898215/1084879を参照してください。 – zapstar

+0

@zapstar私はそれを持って、それはループを書くと言った 'void clear(void) { while(getchar()!= '\ n'); } '私のプログラムに実装する方法 –

+0

これはWindows上で動作するかわかりません。通常、代わりに 'scanf("%c%* c "、&r)'を使用します。 – zapstar

答えて

2

あなたが%s指定子を使用して文字列を読み込むときscanf()機能は、初期の空白文字をスキップしますが、あなたの%c指定子でcharのを読んだときには、これを行いません。使用している関数(これまで使用してはいけない)は、改行を読み取って破棄します。したがって、scanf()への最初の呼び出しには、きれいな入力ストリームがあります。最初にscanf()を呼び出すと、値は変数bに読み込まれますが、末尾の改行は入力ストリームに残されます。次に、次の値を読み込もうとすると、入力する値ではなく、scanf()がこの改行を取得します。このため

一つの修正は、このような入力ストリームから不要な文字を破棄することです:

while (getchar() != '\n') 
    continue;    // discard unwanted characters 

あなたは本当に慎重になりたい場合にも、条件式EOF文字をテストすることができます。この方法の利点の1つは、2番目のプロンプトでユーザーが入力した文字の数に関係なく、1番目の文字のみが使用され、改行の残りの文字は破棄されます。入力ストリームに何も残っていないので、scanf()は、ユーザーが3番目のプロンプトで何かを入力するのを待たなければなりません。入力ストリームがクリアされていることを確認するには、scanf()を呼び出すたびにこのコードを配置する必要があります。

今や、gets()は、バッファオーバーフローを嫌う恐ろしい、安全でない関数です。バッファオーバーフローは、取得している文字列に十分なメモリが割り当てられているかどうかをチェックしないためです。代わりに、fgets()を使用してください。この関数は、ヌルターミネータを含めて、読み込む最大文字数を指定する引数をとります。 fgets()は、改行文字を文字列に読み込むので、必要がない場合は改行文字を破棄する必要があります。ここではあなたが作る必要があるの変更は以下のとおりです。

int i = 0; 
... 
char b,r; 
printf("enter the string\n:"); 
fgets(a, 100, stdin); 

while(a[i] != '\n' && a[i] != '\0') // remove newline 
    ++i; 
a[i] = '\0'; 

printf("enter the the letter to be replaced\n:"); 
scanf("%c", &b); 
while (getchar() != '\n') 
    continue;    // discard unwanted characters 

printf("enter the letter to be replaced with\n:"); 
scanf("%c", &r); 
while (getchar() != '\n') 
    continue;    // discard unwanted characters 

replace(b,r); 
printf("%s\n", a); 
... 

私が変更された文字列を表示するために、最終的なprintf()を追加しました。

+0

継続はどういう意味ですか?私は++と同じですか? - @ DavidBowling –

+0

@steventhomas:あなたのCの本、またはマニュアルを見つける時間。 'continue'は、ループの次の反復に行き、' for'ループの3番目の部分を実行してから条件に戻る(戻る)標準的なCの文です。 (i = 0; i <10; i ++)で 'continue 'は' i <10 'の条件を再評価する前に' i ++ 'を実行します。 –

+0

'continue'文はループ本体の最後にジャンプしますが、実際には必要ありません。ここでループはとにかく続行されますが、何が起こっているかを明示的に示す方法です。私は 'continue;'の代わりにセミコロンを使用しましたが、空のループボディはそれほど説明的ではありません。 –

関連する問題