2017-09-14 7 views
0

Help!文字列(名前)からイニシャルを取得するプログラム、すべての空白を取り除くことはできません

#include <stdio.h> 
//CS50 Library for 'get_string() user input' 
#include <cs50.h> 
#include <string.h> 
#include <ctype.h> 

int main(void){ 
    printf("Enter your name: "); 
    //User input for string 
    string s = get_string(); 
    int i = 0; 
    //Determine whether the first chars are space - if not print char 
    if(s[0] != isspace(s[0])){ 
      printf("%c",s[0]); 
     } 
    //loop through each Char - determine char is not space 
    while(s[i] != '\0'){ 
     if(s[i] == ' '){ 
      //if i'th char is space - add one to it thus printing char that comes after space 
      printf("%c", toupper(s[i+1])); 
     } 
     //advance i'th char count 
     i++; 
    } 
    printf("\n"); 
} 

ときI入力「ジョン・ジェラルド・スミス」:私はすべてのイニシャルをつかむためにC言語でプログラムを書いています - - 私はポインタについては何ので、それらから離れて滞在しようとすることができますを知っていない、これは私がこれまで持っているものですプログラムは "JGB"で戻ってきますが、 "John gerald smith"(複数のスペース)のようなものを入力しようとすると、スペースが削除されないようです。私はまだ出力の頭文字を取得するが、私はそれがすべてのスペースを印刷していないことを確認する必要があります。助けてください!これは宿題なので、私は答えを手渡すとは思っていませんが、誰かが私にそれをどうおこなうかについての情報を私に与えることができたら、私はそれを高く評価します。ありがとう!

+0

だけを見てはいけません現在の文字だけでなく、NEXT文字がスペースでないかどうかを示します。境界チェックに注意してください(文字列の最後を過ぎないようにしてください) – meisen99

答えて

0
#include <stdio.h> 
//CS50 Library for 'get_string() user input' 
#include <cs50.h> 
#include <string.h> 
#include <ctype.h> 

int main(void){ 
    printf("Enter your name: "); 
    //User input for string 
    string s = get_string(); 
    int i = 0; 
    //Determine whether the first chars are space - if not print char 
    if(!isspace(s[0])){ 
      printf("%c",s[0]); 
     } 
    i++; 
    //loop through each Char - determine char is not space 
    while(s[i] != '\0'){ 
     if(s[i-1]==' ' && s[i] != ' '){ 
      //if i'th char is space - add one to it thus printing char that comes after space 
      printf("%c", toupper(s[i])); 
     } 
     //advance i'th char count 
     i++; 
    } 
    printf("\n"); 
} 

まずそれがスペースであれば、それは現在の文字がそうではないスペースかであり、それは宇宙の印刷でない場合は、現在の文字かどうかを確認し、天気前の文字がスペースまたはではありませんチェックします。

これが役に立ちます。

1

文字列の最初の文字の「特殊なケースコード」を避けることによって、@ yajivによる元の応答と別の方法でアプローチします。

私はリストを1つ実行し、文字を出力するときを知るためにいくつかの "状態"を使用します。

  • 我々は、我々は、出力に次の非スペースを望んでいることを知っているスペースを参照してください(ので、我々はprintNextNonSpaceを設定)

  • 我々は非スペースが表示されたらprintNextNonSpaceが設定(とされている場合、我々はそれを印刷

  • printNextNonSpaceは最初に1に設定されているため、空白でない場合は文字列の最初の文字を出力します。

これはどこかの文字列"Andrew Bill Charlie" -> "ABC"における任意の数のスペースを処理することに注意してください、" David Edgar Frank " -> "DEF"

[OPが賢明ヒントが大皿に答えていたかったとして削除コード]

+0

forループを使用してchar配列を反復処理し、forの中から関数printNextNonSpaceを呼び出すことをお勧めしますか? –

+0

いいえ。あなたはwhileループを使用することができます。余分な機能は必要ありません。現在見ている文字を印刷するかどうかを知るためのフラグです。 – John3136

関連する問題