c |比较字符串格式

时间:2017-08-08 15:51:56

标签: c ansi-c

我想知道字符串是否有任何简单选项等于格式字符串。 例如,我希望此格式.mat[something][something]等于使用strcmp.mat[r1][r2].mat[4][5]

有没有选择使用排序的正则表达式?或类似strcmp(.mat[%s][%s], .mat[r3][r5])的内容?

顺便说一句,我使用的是ansi-c 感谢

2 个答案:

答案 0 :(得分: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["    // 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

答案 1 :(得分: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();