0

一連のファイル名(単一の「文字列」に格納され、コンマで区切られている)を取得し、それらに基づいて動作するプログラムが必要です。

疑似コードは次のようになります。

for each filename in some_string
    open filename
    operate on contents of filename
    close filename

問題は、some_string( "filename1、filename2、...、filenamen")を[filename 1]、[filename 2]、...[filenamen]に分離するのに行き詰まっていることです。

編集:明確にするために、some_stringをそのままにして、必要に応じて各ファイル名を抽出する方が簡単なようです。これが私がやろうとしていることです。

私のコードは、現状ではかなり不格好です(そしてかなり嫌です...)

int j = 0;
char *tempS = strdup(filenames);
while (strchr(tempS, ',')) {
    char *ptr = strchr(tempS, ',');
    *ptr++ = '.';
    numFiles++;
}

for (; j < numFiles; j++) {
    char *ptr = strchr(tempS, ',');

    //don't know where to go from here...
    fin = openFile(tempS);
    if (fin != NULL) {
        //do something
    }
    fclose(fin);
}

明らかに、それは行われていません。ファイルの数は正しくわかりますが、ソース文字列から一度に1つずつ分離して操作する方法を理解することに関しては、少し迷っています。

4

3 に答える 3

1

通常、Cで文字列を分割するには、C標準ライブラリのstrok()関数が使用されます。

#include <string.h>
...
char *token;
char *line = "string1,string2,string3";
char *search = ",";

token = strtok(line, search);

token = strtok(NULL, search);
于 2012-12-02T23:51:32.603 に答える
1

strtokこれに使用できます

char *fname = strtok(tempS, ",");
while (fname != NULL) {
    /* process filename */
    fname = strtok(NULL, ",");
}

strtokカンマで区切られた文字列を1つずつ配信します。

于 2012-12-02T23:53:02.520 に答える
0

strtok()はマルチスレッドセーフではありません。それが重要な場合は、strtok_r()を使用する必要があります。例えば:

    char *savedptr = NULL /* to be passed back to strtok_r in follow-on calls */
    char *tempS = strdup( some_string ); /* to keep your original intact */
    char *fname = strtok_r(tempS, ",", savedptr);
    while (fname != NULL) {
        /* process fname ... */
        fname = strtok_r(NULL, ",", savedptr); /* pass savedptr back to strtok_r */
    }
于 2012-12-03T03:57:46.950 に答える