使用Scanf()读取特定字符串
我正在尝试使用scanf()在C中读取特定格式的字符串 字符串的格式为:使用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
<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");
}
}