2013-11-02 224 views
1

我搜索了很多,但找不到處理以下情況的最佳方法。C - 在格式化字符串中查找子字符串

我有格式化這樣的字符串的數組:

username, password, usertype 

例如,

joseph, secret, user 

(陣列被最初從文件加載)。

我想採取用戶輸入(只有usernamepassword),並比較我陣列中的所有字符串,看看是否有匹配。

user input - (username) joseph  (password) secret 
-> matches joseph, secret, user 

我試着用用子和strtok的...有沒有用C處理這個問題的標準方法嗎?

使用的strstr

/* Search users */ 
    for (i = 0; i < n_users; i++) { 
    if(strstr(users[i], username) != NULL) { 
     printf("\t! Found user at %d\n", i); 
     break; 
    } 
    } 

這是不完全正確,因爲如果要是Bobby,然後by將返回true的用戶名...

+0

告訴我們你的企圖..! – Anirudha

+0

我更新了我的問題! –

+0

瀏覽string.h函數並找到您的解決方案。 – zubergu

回答

1

雖然沒有標準的方式,也當然是一個簡單的解決辦法:如果你有你的確切格式字符串,就足夠了格式化兩部分組成的串一樣串的前綴被搜索,然後比較使用strstr串,並驗證結果從返回匹配第一個字符串。

這裏是你如何能用於搜索的字符串:

int len = strlen(username)+strlen(passwd)+3; // space, comma, and \0 
char *cmpString = malloc(len); 
sprintf(cmpString, "%s, %s", username, passwd); 
for (i = 0; i < n_users; i++) { 
    if(strstr(users[i], cmpString) == users[i]) { // cmpString is a prefix 
     printf("\t! Found user at %d\n", i); 
     break; 
    } 
} 
free(cmpString); 
+0

謝謝!我試圖分裂的文件串入變量進行比較的用戶名和PW。我喜歡你的更好的解決方案:結合用戶名和PW成一個字符串,然後比較文件串! –

0

您可以使用strstr找到一個子。或者您可以使用sscanf解析字符串(這是不是使用strtok)和strcmp來驗證用戶確實輸入有效的用戶名和密碼(即其中用戶輸入的用戶類型,或者只名或密碼,甚至一些壞的部分檢測情況作爲'用戶名,密碼')