2016-04-07 18 views
0

Pure Cのプログラムを作成しています(私の年度末コースプロジェクトの要件)。 csv値を格納するファイルは.datです。私はファイルを行とファイルを区切り文字で分割する関数を関数を、文字列分割関数はIDEでの変更まで完全に正常に動作したファイルを1行ずつ読み取る関数が見つかりました。私はJetBrainsの学生ライセンスを取得し、最近64ビットラップトップを購入しましたので、CLionにアップグレードしました。そのコードの特定のビットに問題が発生し始めたとき、プログラムの行がコードの行に到達したとき、特に文字列の最後の区切りを読み取るときにプログラムがハングします。デリミネーターで文字列を分割する

functions.c :: str_split

char** str_split(char* a_str, const char a_delim) 
{ 
    char** result = 0; 
    size_t count  = 0; 
    char* tmp  = a_str; 
    char* last_comma = 0; 
    char delim[2]; 
    delim[0] = a_delim; 
    delim[1] = 0; 

    /* Count how many elements will be extracted. */ 
    while (*tmp) 
    { 
     if (a_delim == *tmp) 
     { 
      count++; 
      last_comma = tmp; 
     } 
     tmp++; 
    } 

    /* Add space for trailing token. */ 
    count += last_comma < (a_str + strlen(a_str) - 1); 

    /* Add space for terminating null string so caller 
     knows where the list of returned strings ends. */ 
    count++; 

    result = malloc(sizeof(char*) * count); 

    if (result) 
    { 
     size_t idx = 0; 
     char* token = strtok(a_str, delim); 

     while (token) 
     { 
      assert(idx < count); 
      *(result + idx++)= strdup(token); 
      token = strtok(0, delim); 
     } 
     assert(idx == count - 1); 
     *(result + idx) = 0; 
    } 

    return result; 
} 

そしてそれはmain.cの中で、このように呼ばれて::メイン

... 
while ((read =(size_t)getline(&file_line, &len, fp)) != -1) { 
     char **tokens; 
     tokens = str_split(file_line, ','); 
... 

プログラムは、この行にハング...エラーをスローしませんが、GDBデバッガが表示されて停止したときにIDEがlibのインクルードを示唆することによってこのエラーを解決しようとしますが、これは役に立たなくなります。 Output from the debugger..

+0

**純粋なC **はこれがエディタです...、IDE? – Michi

+1

'strdup'は標準ライブラリ関数ではありませんが、実装によっては' strdup'を ''に入れます。 CLIONは明らかに 'strdup'を' 'に入れていますので、そのファイルを含めてみてください。 – user3386109

+0

エラーのためにmallocをチェックする必要があります – Michi

答えて

0

問題は修正され、CMakeList.txtは任意の手段で編集され、Cコンパイルの標準が変更されました。それはc11に変更されました。標準c11は標準c99と同じ方法でstrdup()を実装せず、c11ではなくc99標準を使用して記述されています。

+0

実際には、実際の問題は、 'strdup()'のプロトタイプを得るためには、コードを次のうちの1つ以上でコンパイルする必要があります: '_SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE> = 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED ||/* glibc 2.12以降:*/_POSIX_C_SOURCE> = 200809L'この文をソースファイルの先頭に置くことをお勧めします: '#define _POSIX_C_SOURCE = 200809L'注:この定義はしばしば必要です。これを '-D'パラメータに配置するようにIDEの設定を編集することを提案してください – user3629249