我正试图使用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
最终会变成垃圾。我只是不知道如何阅读它以及如何只获得大写字母。
由于
答案 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");
}
}