2013-11-02 5 views
1

Я много искал, но не смог найти лучший способ подойти к следующей ситуации.C - Найти подстроку в отформатированной строке

У меня есть массив строк, отформатированные таким образом:

username, password, usertype 

Например,

joseph, secret, user 

(Массив сначала загружается из файла).

Я хотел бы ввести пользовательский ввод (username и password) и сравнить со всеми строками в моем массиве, чтобы увидеть, есть ли совпадение.

Пример

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 вернется правда ...

+0

показать нам вашу попытку ..! – Anirudha

+0

Я обновил свой вопрос! –

+0

Просмотрите функции string.h и найдите решение. – zubergu

ответ

1

Хотя нет никакого стандартного способа, есть, конечно, простой Решение: если у вас есть ваши строки в точном формате, достаточно отформатировать строку из двух частей так же, как префикс искомых строк, а затем сравнить для подстроки с помощью strstr и проверить, что результат, возвращаемый с 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, чтобы убедиться, что пользователь действительно ввел действительное имя пользователя или пароль (то есть обнаружил случаи, когда пользователь вводит пользовательский тип или только часть имени или пароля или даже что-то не так как «имя пользователя, пароль»)

Смежные вопросы