sscanf格式的字符串,可以检测连字符和非连字符的字符串

时间:2018-11-07 20:36:21

标签: c++ scanf

我正在研究使用sscanf()检测输入的实现。 输入将包含连字符“-”,也可以不包含连字符。字符串的长度和连字符的位置将有所不同。 例子:

"18509726-550"
"14782"

我一直在尝试为带连字符的字符串想出一个返回值> 0的格式字符串,但对于没有连字符的字符串却想返回> 0,但是我没有成功。这可能是不可能的。我还意识到,有很多更好的方法可以实现此目的,但是这段代码是在我写这篇文章之前写的。

代码:

// what format string will return 0 for one but not the other?
String^ pszString = "18509726-550"; // or "14782"
int nP;
char buffer[256];
char buffer1[256];
const char* pSrc = (gcnew marshal_context())->marshal_as<const char*>(pszString);
nP=sscanf(pSrc, "%[-]s", buffer, buffer1);

我尝试了几种格式字符串:

"%s-%s"
"%[0-9-]s"
"%[-]s"
"%[^-]s"

我已经找到了所有可以找到的sscanf文档,我认为单独使用sscanf是不可能的,但是验证也有帮助。 谢谢SO社区!

1 个答案:

答案 0 :(得分:0)

[]已采用s格式。 只需使用"%[^-]-%[^-]"

#include <stdio.h>

void test(const char* s)
{
    char s1[100]{}, s2[100]{};
    int n = sscanf(s, "%[^-]-%[^-]", s1, s2);
    printf("%d: %s, %s\n", n, s1, s2);
}

int main()
{
    test("18509726-550");
    test("14782");
}

打印:

2: 18509726, 550
1: 14782,