簡體   English   中英

在C中使用strtok進行字符串解析

[英]String parsing using strtok in C

我想逐行讀取.csv文件,然后檢查我的行的第一個單詞是否與string_1匹配。 如果匹配,那么我還想檢查第二個字是否與string_2匹配。 我的.csv文件包含三個字段,即用戶,密碼和類型。 到目前為止,這是我的代碼:

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將我的行分成三個子串,然后對它們執行strcmp嗎? 如果是這樣,我該怎么做?

這些方面的內容怎么樣:

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;
}

當然,此代碼假定您已經信任字符串userpassword並且它也未經測試。

我不想聽起來很迂腐但是當你打開一個文件時,你應該添加一個if來測試文件是否可以打開。 就像是:

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

或者至少要注意的是,如果無法打開文件來跟蹤問題。

您遇到的最大問題是strtok(verifyUser, ", ")將在逗號和空格上分割輸入行,因此如果您的任何字段包含空格(例如真實姓名),它們將被拆分為多個字段。

使用strtok的常用方法是循環:

for (token = strtok(inputLine, ","); token; token = strtok(0, ",")) {
    /* do something with token */

首先,你不是逐行讀取它。你正在將50個字符復制到verifyUser
所以它的工作時間不得超過緩沖區大小(50) fgets(verifyUser,50,數據)

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
     }
}

順便說一句,如果你做錯誤檢查就好了...就像fopen()失敗一樣(那么你不應該運行其余的代碼..)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM