0

編集:どうやら、pigLatin メソッドの先頭で char *first を宣言し、メソッドの後半で &word[counter] に初期化する必要があったようです。これがなぜなのか知っている人はいますか?Visual Studio 2010 を使用しています。

これによりコンパイル時エラーが発生する理由を理解するのに苦労しています。問題のコード:

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

char *pigLatin(char *word)
{
   if (word[0] == 'a' || word[0] == 'e' || word[0] == 'i'
           || word[0] == 'o' || word[0] == 'u')
   {
       char yay[] = "yay";
       strcat(word, yay);
       return word;
   }
   else
   {
       int length = strlen(word);
       int counter = 0;
       char addOn[] = "";
       char remainder[] = "";
       char yay[] = "yay";
       printf("%s", yay);

       char *first = &word[counter]; 
       printf("%c", *first); // error is here, don't know why it doesn't print
       return word;
   }
}


int main()
{
   char hello[] = "hello";
   pigLatin(hello);
   printf("%s", hello);
   getch();
   return (0);
}

1>------ ビルド開始: プロジェクト: Program_One、構成: リリース Win32 ------

1> programone.c

1>programone.c(12): 警告 C4996: 'strcat': この関数または変数は安全でない可能性があります。代わりに strcat_s の使用を検討してください。非推奨を無効にするには、_CRT_SECURE_NO_WARNINGS を使用します。詳細については、オンライン ヘルプを参照してください。

1>programone.c(24): エラー C2143: 構文エラー: ';' がありません 「タイプ」の前に

1>programone.c(25): エラー C2065: 'first': 宣言されていない識別子

1>programone.c(25): エラー C2100: 不正な間接化

========== ビルド: 0 成功、1 失敗、0 最新、0 スキップ ==========

配列「hello」の最初の文字へのポインターが正しく印刷されない理由がわかりません。

前もって感謝します !

4

4 に答える 4

3

最初の文字のアドレスを指すようにポインター変数を割り当てていません。文字自体の値をポインタ変数に割り当てているため、コンパイラ エラーが発生します。

この行を変更する必要があります:

char *first = word[counter]; 

これに:

char *first = &word[counter]; 

または、代わりに次のようにします。

char *pigLatin(char *word)   
{   
    int counter = 0;   
    printf("%c", word[counter]);
    return word;   
}   

更新:コードがコンパイルされたとしても、危険です。に関するコンパイラの警告strcat()は有効です。"yay"母音で始まる入力単語に追加するための十分なメモリが割り当てられていません。このコードをより安全にするstd::stringには、生のポインターの代わりにクラスを使用する必要があります。

#include <conio.h> 
#include <string> 

std::string pigLatin(const std::string &word) 
{ 
    switch( word[0] )
    {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u': 
            return word + "yay"; 
    }

    int length = word.length(); 
    int counter = 0; 
    //...

    printf("%c", word[counter]);
    return word; 
} 

int main() 
{ 
   std::string word = pigLatin("hello");
   printf("%s", hello.c_str()); 
   getch(); 
   return 0; 
} 
于 2012-05-30T23:40:25.077 に答える
1

現在、コンパイラにfirstの値を指すように指示していますが、word[counter]これは、メモリ内の奇妙な場所を指していることを意味します。配列の最初の要素を指したいので、次のように置き換える必要があります。

char *first = word[counter];

と:

char *first = &word[counter];

また:

char *first = word;

編集- コメントで言及したコンパイラ エラーは、ソース コードの 23 行目と 24 行目に関連しています。上記の例では、23 行未満です。したがって、エラーは、ここに投稿していない余分なコードにある必要があります...

Edit2 - いくつかのマイナーな調整により、コードは私には機能するように見えます: http://codepad.org/73BKMSgv

于 2012-05-30T23:39:25.530 に答える
0

char str[] = "テスト";
char* p;
p = 力;
printf(p[0]);

出力:
t

于 2015-01-19T19:19:29.037 に答える