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

ユーザー名が の場合Bobbybytrue が返されるため、これは正しくありません...

4

2 に答える 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して文字列を解析し ( を使用する代わりにstrtok)、strcmpユーザーが実際に有効なユーザー名またはパスワードを入力したことを確認することができます (つまり、ユーザーがユーザータイプを入力した場合、または名前またはパスワードの一部のみを入力した場合、または 'username 、パスワード')

于 2013-11-02T14:55:01.227 に答える