1

我搜索了很多,但找不到处理以下情况的最佳方法。

我有一个这样格式化的字符串数组:

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

这不太正确,因为如果用户名 if Bobby, thenby将返回 true...

4

2 回答 2

2

虽然没有标准的方法,但肯定有一个简单的解决方案:如果您的字符串具有精确的格式,则将两部分字符串的格式设置为与正在搜索的字符串的前缀相同,然后使用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);
于 2013-11-02T14:54:35.420 回答
0

您可以使用strstr来查找子字符串。或者,您可以使用sscanf解析字符串(而不是 using strtok)并strcmp验证用户是否实际输入了有效的用户名或密码(即检测用户输入用户类型的情况,或仅输入名称或密码的一部分,甚至像 'username , 密码')

于 2013-11-02T14:55:01.227 回答