我搜索了很多,但找不到接近以下情况的最佳方法。
我有一个以这种方式格式化的字符串数组:
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
将返回true ...
答案 0 :(得分:1)
虽然没有标准方法,但肯定有一个简单的解决方案:如果你的字符串格式正确,那么将两部分字符串格式化为与被搜索字符串的前缀相同就足够了,然后进行比较substring使用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);
答案 1 :(得分:0)
您可以使用strstr
查找子字符串。或者,您可以使用sscanf
来解析字符串(而不是使用strtok
)和strcmp
来验证用户是否确实输入了有效的用户名或密码(即检测用户输入usertype的情况,或者只是名称或密码的一部分,甚至是“用户名,密码”之类的东西。