2016-04-27 35 views
2

我triying使用scanf()的 字符串的格式读取与在C特定格式的字符串:阅读使用scanf()的一个特定的字符串

<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

你期待什么被读入str? – fluter

+0

对不起。字符串格式为: op 其中LET是大写字母,op必须是'+'或'%'。 – Telefang

+0

您的示例具有+和* as op,并且所有三个都是括号中的数字。 – fluter

回答

3

试试这个:

#include <stdio.h> 

int main(void) { 
    char let1[2], let2[2], let3[2], op[2]; 
    char line[80]; 
    while(fgets(line, sizeof line, stdin)){ 
     if(sscanf(line, "<%1[A-Z], %1[A-Z], %1[A-Z]> %1[+%]", let1, let2, let3, op) == 4) 
      puts("valid"); 
     else 
      puts("invalid"); 
    } 

    return 0; 
} 
+0

为什么行是[80],为什么每个都是[2]? – Telefang

+2

'[80]'是我的控制台宽度的大小。请更改为您所需的尺寸。(然而,在8中它很小)'[2]':一个字符+空终止符。 – BLUEPIXY

+0

这很好。但是如果我在逗号前添加一个空格,它就不起作用。 我应该在每个%1 [A-Z]上的逗号后加一个空格吗? – Telefang

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字符必须是大写字母的部分。我已经确定了答案,但当然,现在它更加复杂。

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"); 
    } 
} 
相关问题