2012-11-18 60 views
1

我想從.csv文件逐行讀取文件,然後檢查我的行的第一個單詞是否匹配string_1。如果它匹配,那麼我還想檢查第二個單詞是否匹配string_2。我的.csv文件包含三個字段,即用戶,密碼和類型。 這裏是我到目前爲止的代碼:使用strtok進行字符串解析C

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?如果是這樣,我該怎麼做?

+0

第一個提示:'人strtok' –

回答

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

這個代碼假定你已經相信串userpassword,它也未經測試。

+0

請問什麼是'pass'? – iHubble

+0

@iHubble我編輯了答案。 – cnicutar

+0

非常感謝你! – iHubble

1

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

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

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

+1

在執行這樣的函數之前,我確實有一個條件來測試'password。csv'可以打開或不打開,所以沒關係。但感謝您的建議! – iHubble

0

你沒有被Line..you閱讀它行的第一件事情是複製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 
    } 
} 

BTW它一個很好的做法,如果你做錯誤檢查...像什麼 - 如果fopen()失敗(那麼你不應該運行其餘的代碼..)

+0

wats這個代碼或方法錯了..? –

+1

-1:fgets讀取一行 - 「50」是緩衝區大小(因此,如果該行長度超過48個字符,加上尾隨換行符和NUL,則該調用將不起作用)。如果你想讀取任意長的行,getline可能是一個更好的選擇,但fgets是沒有錯的 –

+0

我同意.. fget沒有錯......但正如你所說,它不會工作超過緩衝區大小的長度.. –

1

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

使用strtok通常的方法是在一個循環:

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