C语言 | 比较字符串格式

3
我想找出是否有一种简单的方法来判断一个字符串是否等于一个格式化字符串。 例如,我希望这个格式为.mat[something][something]的字符串等于使用strcmp函数的.mat[r1][r2]或者.mat[4][5]
是否有使用正则表达式或类似strcmp(.mat[%s][%s], .mat[r3][r5])的选项?
顺便说一下,我正在使用ansi-c。谢谢。

ANSI-C不支持正则表达式。如果您使用的是Posix系统,可以使用POSIX正则表达式。 - SergeyA
1
你需要正则表达式,而不是字符串比较。 - Andrejs Cainikovs
2个回答

3
使用最接近正则表达式的scanf扫描设置,这样做是可行的,但非常丑陋:
char row[20], col[20], bracket[2], ignored;
if (sscanf(input, ".mat[%19[^]]][%19[^]]%1[]]%c", row, col, bracket, &ignored) == 3) {
    // row and col contain the corresponding specifications...    
    // bracket contains "]"
    // %c failed to convert because if the end of string
    ....
}

以下是“mat[r1][r2]”的分解转换规范:
- “mat”:数组名。 - “r1”:第一个维度的索引。 - “r2”:第二个维度的索引。
".mat["    // matches .mat[
"%19[^]]"  // matches r1   count=1
"]["       // matches ][
"%19[^]]"  // matches r2   count=2
"%1[]]"    // matches ]    count=3
"%c"       // should not match anything because of the end of string

也许是 ".mat[%19[^]][%19[^]]%1[]]%c" (少了一个 ])。 - chux - Reinstate Monica
1
@chux:太难以阅读了,不是吗?第三个]是必须的,以匹配字符串中的]。因为%1[]]与字符串中的第二个]相匹配,所以它在第二部分中不存在。 - chqrlie
同意 3 ]]] 为了稍微提高可读性 #define INDEX "%19[^]]" ... ".mat[" INDEX "][" INDEX "%1[]]%c" - chux - Reinstate Monica

1

这是对@chqrlie优秀答案的替代方案:它允许使用各种后缀,而且不需要bracket[2]

使用"%n"可以保存扫描偏移量。如果扫描成功到该点,则偏移量将为非零值。

// .mat[something][something]
#define PREFIX ".mat"
#define IDX "[%19[^]]]"
#define SUFFIX ""

char r1[20], r2[20];
int n = 0;
sscanf(input, PREFIX INDEX INDEX SUFFIX "%n", r1, r2, &n);

// Reached the end and there was no more
if (n > 0 && input[n] == '\0') Success();
else Failure();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接