2017-02-08 6 views
0

私はedx.orgでハーバードのcs50に登録しました。私はこの問題を2つ設定して、人々の名前をとり、最初の名前と姓の頭文字。コードはここにあります:名前を入力して最初に姓と頭文字の頭文字を付けます

string initial (string a); 

int main (void) 
{ 
    printf("Give me your name\n: "); 
    string name = GetString(); 

    printf("Give me your second name\n:"); 
    string sname = GetString(); 

    char*c; char*b; 
    c = name; 
    b = sname; 

    printf("%s %s\n", initial(c),initial(b)); 
} 

string initial (char*a) 
{ 

     if (*a >= 'A' && *a <= 'z') 
     { 
     return toupper(*a); 

     else 
     return ("please retype your name"); 
     } 

} 

これは私がコンパイラから得ているエラーメッセージです。

initials.c:27:16: error: incompatible integer to pointer conversion returning 'int' from a function with result type 
     'string' (aka 'char *') [-Werror,-Wint-conversion] 
     return toupper(*a); 
       ^~~~~~~~~~~ 
initials.c:29:9: error: expected expression 
     else 
     ^
2 errors generated. 
make: *** [initials] Error 1 

何が問題なのですか。

+0

if/elseステートメントに '}'と '{'がありません – Musa

+0

http://www.cplusplus.com/reference/cctype/toupper/ 'toupper'がintを返します。これは間違いありません文字列。 –

+0

@ KamiKazeこれはC++リソースであり、タグの言語はC++ではありません。 –

答えて

0

toupper()関数は文字列を返さないとCには、このようなタイプが存在しない、あなたはどんな高いで何が内部で起こるように、この

a[0] = toupper(a[0]); 
return a; 

ノートのように最初に変換する各文字を変換する必要がありますこれはまさにこれであり、各文字は個別に変換されます。

また、関数に渡したオブジェクトと同じオブジェクトを変更しているため、main()の変数も変更されることに注意してください。

そして、もっと重要なのは、char *として定義stringタイプは非常に誤解を招く使用して、あなたがCプログラマが

  1. で注意しなければならないことを、多くの重要なことを隠しているタイプstringの変数はポインタです。
  2. 文字列は実際には'\0'で終わる文字の配列なので、私が行ったようにforというループが書かれています。
  3. このような型を定義することで、プログラマは+演算子で連結文字列が可能であると推測するかもしれません。これは未定義の振る舞いだけを引き起こします。
関連する問題