如何比较C中字母只包含数字的字符串

时间:2017-05-16 11:18:06

标签: c string string-comparison scanf

我需要比较字母和数字的字符串,只需字母和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*扫描程序来做到这一点,但如果有更简单的方法,我想避免这种情况。

2 个答案:

答案 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; } } 应该匹配吗?上面的答案假设没有。