C - 在格式化字符串中查找子字符串

时间:2013-11-02 14:49:50

标签: 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 ...

2 个答案:

答案 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的情况,或者只是名称或密码的一部分,甚至是“用户名,密码”之类的东西。