0
oauth_token=requestkey&oauth_token_secret=requestsecret

NSScanner を使用して「requestkey」と「requestsecret」を取得するにはどうすればよいですか。私はそれを達成することができないようです。

NSScanner* scanner = [NSScanner scannerWithString:string];
NSString *oauth_token = @"oauth_token=";
NSString *oauth_token_secret = @"oauth_token_secret=";
[scanner setCharactersToBeSkipped:nil];

NSString *token;
NSString *key;


while (![scanner isAtEnd]) {
    [scanner scanString:oauth_token intoString:NULL];
    [scanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"&"] intoString:&token];
    [scanner scanUpToString:oauth_token_secret intoString:NULL];
    [scanner scanUpToString:oauth_token intoString:&key];

    NSLog(@"token%@", token);
    NSLog(@"key %@", key);

//token requestkey
//key oauth_token_secret=requestsecret

}

なぜそれがnullなのか理解できないようです。ありがとう!

4

1 に答える 1

1

nullはありません。だから私はそれに話すことができません。

コードのロジックを1行ずつ実行するだけの場合、実際には非常に単純なエラーです。例えば:

[scanner scanString:oauth_token intoString:nil];
// The cursor is now just after the equals sign.
[scanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"&"] intoString:&token];
// This leaves the cursor just BEFORE the &.
[scanner scanUpToString:oauth_token_secret intoString:nil];
// This leaves the cursor just BEFORE the "oauth_token_secret="
[scanner scanUpToString:oauth_token intoString:&key];
// This scans effectively the rest of the string into &key which is in fact
// "oauth_token_secret=requestsecret"

これを修正する最も簡単な方法は、scanString:intoString:メソッドを使用してカーソルをの末尾に進めることですoauth_token_secret

[scanner scanString:oauth_token intoString:nil];
[scanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"&"] intoString:&token];
[scanner scanUpToString:oauth_token_secret intoString:nil];
// This leaves the cursor just BEFORE the "oauth_token_secret="

// **FIX HERE**
[scanner scanString:oauth_token_secret intoString:nil];
// The cursor is now AFTER oauth_token_secret.

[scanner scanUpToString:oauth_token intoString:&key];

ログ出力に有用な文字列が表示されるようになりました。

token:requestkey
key  :requestsecret

ただし、コメントセクションでH2CO3が述べてcomponentsSeparatedByString:いるように、このユースケースにははるかに適しています。

于 2012-08-28T19:12:32.600 に答える