使用Scanf()读取特定字符串

时间:2016-04-27 04:28:55

标签: c text io formatting scanf

我正试图使用​​scanf()在C中读取具有特定格式的字符串 该字符串的格式为:

<LET,LET,LET> op

其中LET是大写字母,op必须是'+''%'

这些是有效的条目:

<A,B,C> +
<A,W,Z> %
<Q,   X,W>    +

这些不是:

<A,b,C> +
<A,W,Zddddd> %
<Q,X,W> *

我正在尝试这样的事情

#include <stdio.h>

int ret = 0;
char str[8];
ret = scanf("%8[^\n]",str);

但是str最终会变成垃圾。我只是不知道如何阅读它以及如何只获得大写字母。

由于

3 个答案:

答案 0 :(得分:3)

试试这个:

-(void)verifyEmail:email
{
[kappDelegate ShowIndicator];
NSMutableURLRequest *request ;
NSString*_postData ;
webservice=1;
_postData = [NSString stringWithFormat:@"emailAddress=%@&matchCriteria=%@",email,@"NONE"];
request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://svcs.sandbox.paypal.com/AdaptiveAccounts/GetVerifiedStatus"]] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:60.0];
[request setHTTPMethod:@"POST"];
[request addValue:@"jb-us-seller_api1.paypal.com" forHTTPHeaderField:@"X-PAYPAL-SECURITY-USERID"];
[request addValue:@"WX4WTU3S8MY44S7F" forHTTPHeaderField:@"X-PAYPAL-SECURITY-PASSWORD"];
[request addValue:@"AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy" forHTTPHeaderField:@"X-PAYPAL-SECURITY-SIGNATURE"];
[request addValue:@"APP-80W284485P519543T" forHTTPHeaderField:@"X-PAYPAL-APPLICATION-ID"];
[request addValue:@"NV" forHTTPHeaderField:@"X-PAYPAL-REQUEST-DATA-FORMAT"];
[request addValue:@"JSON" forHTTPHeaderField:@"X-PAYPAL-RESPONSE-DATA-FORMAT"];
[request setHTTPBody: [_postData dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if(connection)
{
    if(webData==nil)
    {
        webData = [NSMutableData data] ;
        NSLog(@"data");
    }
    else
    {
        webData=nil;
        webData = [NSMutableData data] ;
    }
    NSLog(@"server connection made");
}
else
{
    NSLog(@"connection is NULL");
}
}

答案 1 :(得分:0)

替代BLUEPIXY的完美答案,就是简单地使用char,然后使用%c扫描输入,例如:

#include <stdio.h>
#include <ctype.h>

int main()
{
    char let1, let2, let3, op;
    char line[80]; // or some other suitable size

    while (fgets(line, sizeof line, stdin))
    {
        if (sscanf(line, "< %c , %c , %c > %c", &let1, &let2, &let3, &op) == 4 && (op == '+' || op == '%') && isupper(let1) && isupper(let2) && isupper(let3))
        {
            printf("valid!\nlet1 = %c\nlet2 = %c\nlet3 = %c\nop = %c\n", let1, let2, let3, op);
        }
        else
        {
            puts("invalid");
        }
    }
}

请注意%c之前和之后的空格非常重要,因为它们允许sscanf在尝试匹配%c或逗号之前吞噬所有空格。

与BLUEPIXY的答案不同,我们必须手动检查op是否匹配+%

编辑:我错过了LET字符必须为大写的部分。我已经修复了答案,但当然现在更复杂了。

答案 2 :(得分:0)

此方法还会检测线路上的线索垃圾。

"%n"保存当前扫描的偏移量。仅当n非零并且索引'\0'成功时才会出现。

通过使用字符串文字串联,代码可以清楚地显示扫描的各个部分使用的格式。

#include <stdio.h>

#define F_LET " %1[A-Z]"
#define F_SEP " ,"
#define F_OP  " %1[+%]"

int main(void) {
  char buf[100];
  while (fgets(buf, sizeof buf, stdin)) {
    char let[3][2];
    char op[2];
    int n = 0;
    sscanf(buf, " <" F_LET F_SEP F_LET F_SEP F_LET " >" F_OP " %n", 
        let[0], let[1], let[2], op, &n);

    puts((n && buf[n] == '\0') ? "Success" : "Fail");
  }
}