2016-08-17 15 views
-3

ファイルからのデータを配列に保存しようとしていますが、今のところ運がないです。単なる数字の場合にファイルから読み込んだ後にデータを保存するのは簡単ですが、たとえば文字列を保存しようとしている場合など、プログラムは何度も繰り返しクラッシュします。私はfscanf()を使用しています。関数.txtファイル全体が "姓、名字"と同じ形式で記述されているためです。今度は、私はこの方法でforループを試してみました:ファイル内の文字列を扱う

char *firstName = (char*)malloc(sizeof(char)*10240); 
char *lastName = (char*)malloc(sizeof(char)*10240); 
for(int i = 0; i<10; i++){ 
    fscanf(fp, "%s %s", firstName[i],lastName[i]); 
} 

それはクラッシュする場所です。

+2

1つの言語を選んで標準入力からの読み取りフルC++例

、。 – chux

+0

デバッグヘルプ(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:最小、完全、および検証可能な例を作成する方法。 – Olaf

+0

Cのように見えますが、実際にはC++ならfstreamの使用を検討してください – alexeykuzmin0

答えて

-1

コードのエラーは次のとおりです。firstName [i]は文字列ではありませんが、%cの代わりに%sを使用して文字列のように使用します。

char *の代わりにchar **を使用する必要があります。

char ** firstName =(char **)malloc(10 * sizeof(char)* 10240);

10240はfirstNameにはあまりにも多いと思います。 255以下を使用してください。

+0

それはうまく動作しません。 102400バイトの連続する1つの配列は、10個の文字列ポインタの配列と同じではありません。 –

+0

インデックスの代わりにオフセットを使用する場合、私は同意します。その場合、firstNameとoffsetのようにアクセスしてください。firstname [i]ではありません。 – madago

+0

オフセットは文字列が読み込まれた分だけ更新されます。 – madago

2

ピュアCコード:

あなたはそれは大きなサイズの一時文字列に文字列をスキャンし、以降の文字列を複製するのが最善です1 によって各文字列1を割り当て、その後、最初の配列の配列を割り当てる必要があります。それは(確か、またはC99ではない)C準拠したのではなくC++に準拠していないので、私はfor (ifor (int iを変更した

int i,nb_names = 10; 
char **firstName = malloc(sizeof *firstName * nb_names); 
char **lastName = malloc(sizeof *lastName *nb_names); 
char tempn[1000],templ[1000]; 
for(i = 0; i<nb_names; i++){ 
    fscanf(fp,"%s %s", tempn,templ); 
    firstName[i] = strdup(tempn); 
    lastName[i] = strdup(templ); 

} 

注意。 C++の場合、mallocsを削除し、std::vectorstd:stringを代わりに使用してください。

できればC++を使用することをお勧めします。私は、2D配列を適切に割り当てることを試みている(そして失敗している)人のC/C++に関する多くの質問に答えました。 C++のライブラリコードを使用するC++ははるかに明確です。 CまたはC++:

#include <vector> 
#include <string> 
#include <iostream> 

using namespace std; 

int main() 
{ 
int nb_names = 10; 
vector<string > firstName(nb_names); 
vector<string > lastName(nb_names); 

for(int i = 0; i<nb_names; i++){ 

    cin >> firstName[i]; 
    cin >> lastName[i]; 

} 
return 0; 
} 
+0

右(それは働いたが、私は運が良かった)。一定。 –

+0

コーディングエラーを避けるために、 'char ** firstName = malloc(sizeof * firstName * nb_names); 'を提案してください。 – chux

+0

が編集されました。あなたの興味に感謝します。 –

関連する問題