1

ファイルから1行ずつ読み取り、その.csv行の最初の単語がに一致するかどうかを確認したいと思いますstring_1。一致する場合は、2番目の単語が一致するかどうかも確認したいと思いstring_2ます。私の.csvファイルには、ユーザー、パスワード、タイプの3つのフィールドが含まれています。これまでの私のコードは次のとおりです。

void verify ( char *user, char *password ) {

    FILE *data;
    char verifyUser[50];

    data = fopen( "password.csv", "r+" );
    while ( fgets(verifyUser, 50, data ) != NULL) {

        char *ptr;
        ptr = strtok(verifyUser, ", ");

        /***What do I do here?***/
    }

    fclose(data);
}

この場合、userpasswordはそれぞれstring_1string_2です。任意のヒント?strtok行を3つのサブ文字列に分割して、それらに対して実行するために使用できstrcmpますか?もしそうなら、どうすればいいですか?

4

4 に答える 4

1

これらの線に沿った何かはどうですか:

ptr = strtok(verifyUser, ", ");
if (!ptr || strcmp(ptr, user))
    continue;

/* Okay, so the user matches. */
char *pass = strtok(NULL, ", ");
if (!pass || strcmp(pass, password)) {
    /* Invalid. */
    break;
}

もちろん、このコードは、文字列がすでに信頼されていることを前提としており、userテストpasswordもされていません。

于 2012-11-18T20:06:55.323 に答える
1

衒学的に聞こえたくないのですが、ファイルを開くときに、ファイルを開くifことができるかどうかをテストするためにを追加する必要があります。何かのようなもの:

if ( ( data = fopen( "password.csv", "r+" ) ) != NULL ){
    printf( "The file couldn't be opened" );
}
else{
   .
   .
   .
}

または、問題を追跡するためにファイルを開くことができなかった場合は、少なくとも注意が必要です。

于 2012-11-18T20:18:08.997 に答える
1

あなたが抱えている最大の問題はstrtok(verifyUser, ", ")、入力行をコンマとスペースの両方で分割することです。そのため、フィールドのいずれかにスペース(実​​名など)が含まれている場合、それらは複数のフィールドに分割されます。

通常の使用方法strtokはループ内です。

for (token = strtok(inputLine, ","); token; token = strtok(0, ",")) {
    /* do something with token */
于 2012-11-18T20:35:53.293 に答える
0

最初に1行ずつ読み取っていないverifyUser
ので、50文字をコピーしているので、バッファサイズの(50)長さより長くは機能しません。fgets(verifyUser、50、data)

readlineにこのようなものを使用するには...

getline(data, yourVariable, '\n');

そして、あなたができることは..

ptr = strtok(yourVariable, ", ");
// now u have to iterate through `ptr` to get all the sub-strings(split-ed using parameter ',')
while(ptr !=NULL){
     if(strcmp(ptr, user)){
         // do stuff here like `break;` etc
     }
}

ところで、エラーチェックを行う場合は良い習慣です... what-iffopen()が失敗した場合のように(その後、残りのコードを実行しないでください..)

于 2012-11-18T20:21:28.237 に答える