我需要比较字母和数字的字符串,只需字母和C中数字的外观。
例如,字符串"first%dsecond%dj"
应被视为等于"first[number]second[number]j"
之类的任何字符串。
我试着这样做:
char *c_i
int i, j;
if (sscanf(c_i, "first%dsecond%dj", &i, &j) == 2 &&
c_i[strlen(in) - 2] == 'j') {
printf("%s", c_i);
}
但是sscanf会忽略最后一个数字后面的所有内容,因此像"first%dsecond%dthird%dj"
这样的字符串也会给出真值并打印出来。
一般来说,sscanf
只关心最后一个说明符之前的字母值,我想找到一些同样重要的字母,比如说比较器检查整个字符串并得到任何数字但数字。
当然,我可以通过创建自己的char*
扫描程序来做到这一点,但如果有更简单的方法,我想避免这种情况。
答案 0 :(得分:3)
使用ah
获取转换的长度,然后检查字符串是否真的在那里结束:
%n
答案 1 :(得分:1)
@unwind的良好答案的变化。
使用"%n"
记录扫描中的当前位置和"*"
,以消除保存为int
的需要。
n
...相应的参数应该是一个指向有符号整数的指针,到目前为止,通过对fscanf
函数的调用,写入从输入流中读取的字符数。 ......C11§7.21.6.212可选的赋值抑制字符
*
。 §7.21.6.23
// return true on match
bool IE_compare(const char *c_i) {
int n = 0;
sscanf(c_i, "first%*dsecond%*dj%n", &n);
return n > 0 && c_i[n] == '\0';
}
注意:格式字符串可以编码为单独的sting文字,以供替代阅读。
sscanf(c_i, "first" "%*d" "second" "%*d" "j" "%n", &n);
上述内容将与"first +123second -456j"
之类的"%d"
之类的前导空格匹配,因为 int n1, n2,
int n = 0;
sscanf(c_i, "first%n%*dsecond%n%*dj%n", &n1, &n2, &n);
return n > 0 && !isspace((unsigned char) c_i[n1]) &&
!isspace((unsigned char) c_i[n2]) && c_i[n] == '\0';
允许这样做。为了避免:
"first+123second-456j"
以上内容会将数字与"%d"
之类的前导符号匹配,因为 sscanf(c_i, "first%n%*dsecond%n%*dj%n", &n1, &n2, &n);
return n > 0 && isdigit((unsigned char) c_i[n1]) &&
isdigit((unsigned char) c_i[n2]) && c_i[n] == '\0';
// or
int n = 0;
sscanf(c_i, "first%*[0-9]second%*[0-9]j%n", &n);
return n > 0 && c_i[n] == '\0';
允许这样做。为了避免:
"firstsecondj"
还有一点不清楚的是,是否需要需要。 “......和一个数字的出现”暗示是的。 package pfe;
public class Ligne_Commande {
private int n_liv1;
private String des_art1;
private float prix_vent1;
private int qte_com1;
public Ligne_Commande(){
super();
}
public Ligne_Commande(String des_art, int qte_com, float prix_vent){
super();
this.des_art1= des_art;
this.prix_vent1= prix_vent;
this.qte_com1= qte_com;
}
public void setN_liv1(int n_liv) {
this.n_liv1 = n_liv;
}
public void setN_art1(String des_art) {
this.des_art1 = des_art;
}
public void setPrix_vent1(float prix_vent) {
this.prix_vent1 = prix_vent;
}
public void setQte_com1(int qte_com) {
this.qte_com1 = qte_com;
}
public int getN_liv1() {
return n_liv1;
}
public String getN_art1() {
return des_art1;
}
public float getPrix_vent1() {
return prix_vent1;
}
public int getQte_com1() {
return qte_com1;
}
}
应该匹配吗?上面的答案假设没有。