2017-05-07 4 views
1

したがって、関数の配列からmain()関数の変数に文字列を返すだけです。以下は私の機能です。主な機能はここにある配列の文字列を関数のC言語の変数に代入するにはどうすればよいですか?

char startPrompt() 
{ 
    //array of files 
    char* arrayFiles[7]={"Room1.txt", "Room2.txt", "Room3.txt", "Room4.txt", "Room5.txt", "Room6.txt", "Room7.txt"}; 
    //used to store file that has START_FILE in it 
    char startFile; 
    int i; 
      for(i=0;i<7;i++) 
      { 
        //pointer to files 
        FILE *fPointer; 
        //prints files to output 
        char loadScreenOutput[800]; 
        char* response[256]; 


        fPointer=fopen(arrayFiles[i], "r"); 
        //checks if the file doesn't exist 
        if(fPointer== NULL) 
        { 
          printf("Unable to open the file!\n"); 
        } 
        //if file exists, do this. 
        else 
        { 
          while(!feof(fPointer)) 
          { 

            fgets(loadScreenOutput, 800, fPointer); 
            if(strstr(loadScreenOutput, "START_ROOM")) 
            { 
              return *arrayFiles[i]; 
            } 
          } 

          fclose(fPointer); 
        } 
      } 

:へ

int main() 
{ 
    char fileName; 
    //start the game with the start file 
    fileName=startPrompt(); 
    printf("%s", fileName) 



    return 0; 
} 

しかし、上記リードそれは基本的に単語のためのいくつかのファイルを検索し、「START_ROOM」を含むファイル名の文字列を返します。セグメンテーション障害。

printf( "%c"、fileName)にprintfを変更すると、ファイルの最初の文字が "R"になります。

「Room1.txt」を返してfileNameに格納するにはどうしたらいいですか?私はそれが問題かもしれないと推測できるので、fileNameの可変型を変更したいと思います。または、関数の戻り値の型を変更してください。これは、それが問題であると推測しています。

私は関数内にprintf()を置くと、 "Room7.txt"という文字が表示されるので、このコードが上にあります。

+0

がなぜそこ 'while'ループです:

char* str = "ABC"; // str will point to a sequence of characters {'A','B','C',0 } char c = 'X'; // c will hold a single character 'X'; printf("%s",str); // will print ABC printf("%s",c); // will probably segfault because c is not a pointer to a sequence of characters, i.e. is NOT A POINTER printf("%c",c); // prints X c = *str; // assignes the first character of the sequence to which str points printf("%c",c); // prints A 

書き、あなたのプログラムを修正するには? 'while(j!= 1)'は、ループの最後にある 'j = 1;'のために1回だけループします。 – InternetAussie

+0

@InternetAussie、私はそれを削除しました。ループは必要ないと思う。申し訳ありませんが、私が以前行っていたことから残しました。 – user7977797

答えて

0

コードはちょっと変わっていますが、主な問題は1文字(つまりchar)に「文字列」、つまり一連の文字を含めると予想されることです。 Cの中の文字列は、特殊値0で終わる文字列です。彼らはしばしばchar* someStringValue = "ABC"として書かれ、文字列リテラルへのポインタで使用されています

char* startPrompt() // char* instead of char; char would be a single character 
{ 
    // static; otherwise the variable and its values go out of scope and become invalid once startPrompt has finished 
    static char* arrayFiles[7]={"Room1.txt", "Room2.txt", "Room3.txt", "Room4.txt", "Room5.txt", "Room6.txt", "Room7.txt"}; 
... 
    return arrayFiles[i]; // not *arrayFiles[i], which would be a single character 

... 

int main() { 
    char* fileName; // char*, not char 
    fileName=startPrompt(); 
    printf("%s", fileName) 
    return 0; 
} 
+0

これは質問に答えます。ありがとう。また、代わりにリターンを取る方が良いでしょうか?それを関数自体に代入しますか?私もそれを検討していた。別名「startPrompt(fileName)」? – user7977797

+0

定義済みのファイル名がある場合は、文字列リテラルの静的な配列に格納し、それらのうちの1つを返します(私の場合と同じように)。 –

0

文字列は、実際には文字の配列です(メモリ内の連続した文字グループへのポインタでもあります)。あなたは配列の最初の文字へのポインタを関数に返させる必要があります。また、char配列宣言では "*"は必要ありません(配列内の最初のcharへのポインタへのポインタを作成します)。

+0

arraFilesの "*"を取り除くと、 "filetest.c:17:error:char配列初期化子の余分な要素 filetest.c:17:エラー:( 'arrayFiles'の初期化に近い) " – user7977797

+0

文字列' arrayFiles'の配列を意味しますか? '*'はそこに必要とされるので「charへの7つのポインタの配列」として読み込まれます。 – InternetAussie

+0

文字列も配列も "メモリ内の連続した文字グループへのポインタ"ではありません。 –

関連する問題