2012-02-27 21 views
0

文字配列を扱うより大きなプロジェクト用の関数を記述しようとしています。私が取り組んでいる現在の機能は、アルファベット文字のみを保存し、特殊文字(例:!#@ $?)とスペースを削除することになっています。私の現在の関数は動作しますが、何らかの理由でそれを実行すると、配列の最初の文字は常に削除されます。それはなぜですか?そして、代わりに最初の文字を保存するにはどうすればいいですか?配列関数は配列から最初の文字を削除します

#include <stdio.h> 

int main(void) 
{ 
    char phrase[101]; 

    printf("Enter a phrase to change:"); 
    fgets(phrase, 101, stdin); 

    printf("original phrase: %s", phrase); 

    int i = 0, j = 0; 
    while(phrase[i] != '\0') 
    { 
    if(('A' <= phrase[i] && phrase[i] >= 'Z') || 
     ('a' <= phrase[i] && phrase[i] >= 'z')) 
    { 
     phrase[j] = phrase[i]; 
     i++; 
     j++; 
    } 
    else 
     i++; 

    phrase[j] = '\0'; 
    } 

    printf("new phrase: %s\n", phrase); 

    return 0; 
} 

答えて

4

あなたの比較演算子の方向が間違っています。代わりに:

if(('A' <= phrase[i] && phrase[i] >= 'Z') || 
    ('a' <= phrase[i] && phrase[i] >= 'z')) 

あなたは必要があります:あなたはそれはそれはあなたの入力の最初の文字をスキップする理由はおそらくある大文字を、スキップします書いた

if(('A' <= phrase[i] && phrase[i] <= 'Z') || 
    ('a' <= phrase[i] && phrase[i] <= 'z')) 

方法。

また、phrase[j] = '\0';行をループの後に移動する必要があります。そうしないと、読み取る次の文字を上書きする可能性があるためです。

+0

あなたは頭の上にそれを釘付け、簡単な修正、ありがとう!:) – Ryan

2

まあ、私は最初の文字が英数字ではないと推測しています。 (それは英数字でなければ)

phrase[j] = '\0'; 

のどちらかは、あなたが最初の文字を削除するか、(最初の英数字の場合)2番目を削除する:あなたは、具体的にそれを削除する行を持っています。

文字列のスキャンが完了した後でのみ、末尾に\ 0を付ける必要があります。

EDIT:あなたのチェックは間違っているので、最初の文字はです。常には英数字ではなく扱われます。だからあなたはそれを消す。

+0

ええ、私はループの外にそれを持っている必要があった私の小切手を切り替えると、他の賢明な私は正しい出力を得ることはできませんでした。ありがとう! – Ryan

0

isalpha()の使用についてはctype.h

if (isalpha(phrase[i])) { 
    phrase[j] = phrase[i]; 
    /* ... */ 
} 

しかし、あなたの質問について話すこと:あなたが'\0'phrase[j]を設定しているため、ループの述語は、それが実行された最初の時間の後に満たされていないので

whileループは、一度訪れています最初にループが実行されます。

編集:ああ、私はifの状態をよく読んでいません。 @interjayが指摘する通り、でもが間違っています。

1

あなたの最初の文字が唯一の大文字であり、あなたのロジックが間違っていると思います。 Cライブラリはまた、 'Z' を 'A' が連続していないEBCDIC文字セットに働くだろうはisalphaを提供していますが

if(('A' <= phrase[i] && phrase[i] >= 'Z') ||  
    ('a' <= phrase[i] && phrase[i] >= 'z'))  

if(('A' <= phrase[i] && phrase[i] <= 'Z') ||  
    ('a' <= phrase[i] && phrase[i] <= 'z'))  

でなければなりません。

関連する問題