在C语言中如何检查输入字符串的格式是否正确?

hc8w905p  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(419)

A想检查输入字符串的格式是否正确

"%d/%d"

例如,当输入为

"3/5"
return 1;

当输入信号

"3/5f"
return 0;

我有想法使用regex来实现这一点,但我在Windows上运行regex.h时遇到了问题。

unhi4e5o

unhi4e5o1#

如何检查输入字符串格式是否正确......?
一个简单的测试是将" %n"附加到一个sscanf()字符串中,以存储扫描的偏移量(如果扫描到了这个位置),然后测试偏移量,看看它是否在字符串的末尾。

int n = 0;
int a, b;
//           v---v----- Tolerate optional white spaces here if desired.
sscanf(s, "%d /%d %n", &a, &b, &n);
if (n > 0 && s[n] == '\0') {
  printf("Success %d %d\n", a, b);
} else {
  printf("Failure\n");
}
x8diyxa7

x8diyxa72#

您并不完全清楚 format"%d/%d"是什么意思。
如果你的意思是字符串应该像sscanf()一样被解析,允许2个十进制数字被/分隔,每个数字前面可能有白色和一个可选符号,你可以这样使用sscanf()

#include <stdio.h>

int has_valid_format(const char *s) {
    int x, y;
    char c;
    return sscanf(s, "%d/%d%c", &x, &y, &c) == 2;
}

如果格式正确,sscanf()将解析由"/“分隔的两个整数,但不解析额外的字符,因此返回2,即成功转换的次数。
下面是乔纳森·莱弗勒(Jonathan Leffler)提出的另一种方法:

#include <stdio.h>

int has_valid_format(const char *s) {
    int x, y, len;
    return sscanf(s, "%d/%d%n", &x, &y, &len) == 2 && s[len] == '\0';
}

如果只接受数字,可以使用字符类:

#include <stdio.h>

int has_valid_format(const char *s) {
    int n = 0;
    sscanf(s, "%*[0-9]/%*[0-9]%n", &n);
    return n > 0 && !s[n];
}

相关问题