Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Scanf()读取特定字符串_C_Text_Io_Formatting_Scanf - Fatal编程技术网

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

使用Scanf()读取特定字符串,c,text,io,formatting,scanf,C,Text,Io,Formatting,Scanf,我正在尝试使用scanf()在C中读取特定格式的字符串 字符串的格式为: <LET,LET,LET> op 这些不是: <A,b,C> + <A,W,Zddddd> % <Q,X,W> * + % * 我正在尝试这样的事情 #include <stdio.h> int ret = 0; char str[8]; ret = scanf("%8[^\n]",str); #包括 int-ret=0; char-str[8]; re

我正在尝试使用scanf()在C中读取特定格式的字符串 字符串的格式为:

<LET,LET,LET> op
这些不是:

<A,b,C> +
<A,W,Zddddd> %
<Q,X,W> *
+
%
*
我正在尝试这样的事情

#include <stdio.h>

int ret = 0;
char str[8];
ret = scanf("%8[^\n]",str);
#包括
int-ret=0;
char-str[8];
ret=scanf(“%8[^\n]”,str);
但是
str
最终会变成垃圾。我只是不知道怎么读,也不知道怎么才能得到大写字母

谢谢

试试这个:

#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;
} 
#包括
内部主(空){
char-let1[2],let2[2],let3[2],op[2];
字符行[80];
而(fgets(生产线、生产线尺寸、标准尺寸)){
如果(sscanf(行“%1[+%]”,let1,let2,let3,op)==4)
看跌期权(“有效”);
其他的
看跌期权(“无效”);
}
返回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");
        }
    }
}
#包括
#包括
int main()
{
字符let1,let2,let3,op;
字符行[80];//或其他合适的大小
而(fgets(生产线、生产线尺寸、标准尺寸))
{
如果(sscanf(行,<%c,%c>%c“,&let1,&let2,&let3,&op)==4&&(op='+'| | op='%')&&isupper(let1)&&isupper(let2)&&isupper(let3))
{
printf(“有效!\nlet1=%c\nlet2=%c\nlet3=%c\nop=%c\n”,let1,let2,let3,op);
}
其他的
{
看跌期权(“无效”);
}
}
}
请注意,
%c
之前和之后的空格非常重要,因为它们允许
sscanf
在尝试匹配
%c
或逗号之前,将所有空格全部填满

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


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

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

“%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");
  }
}
#包括
#定义F_LET“%1[A-Z]”
#定义F_SEP“
#定义F_OP“%1[+%]”
内部主(空){
char-buf[100];
while(fgets(buf、sizeof buf、stdin)){
charlet[3][2];
char-op[2];
int n=0;
sscanf(buf),“F_OP”%n,
let[0],let[1],let[2],op,&n);
put((n&&buf[n]='\0')?“成功”:“失败”);
}
}

您希望将什么读入str?抱歉。字符串的格式为:op,其中LET是大写字母,op必须是“+”或“%”。您的示例将+和*作为op,三者都是括号中的数字。我已修复了它。LET是大写字母,op必须是+或%应该
”或失败?为什么行是[80],为什么每个LET是[2]?
[80]
是我的控制台的宽度大小。请更改为您所需的大小。(但是,在8中它很小)
[2]
:一个字符+空终止符。这很好。但是如果我在逗号前加一个空格,它就不起作用了。我应该在每个%1[a-Z]上的逗号后加一个空格吗?如果编译器不允许
a-Z
,请用
ABCDEFGHIJKLMNOPQRSTUVWXYZ
@Telefang尝试在逗号前后加一个空格。(例如
%1[a-Z],%1[A-Z]
)它似乎适合我。
#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");
  }
}