2010-05-24 34 views
2

sscanf(text,“%s%s”,name,company);sscanf有多个空格?

解析'ian mceknis',但它也解析'ian   mceknis'等。我如何才能解析第一个?它只能包含一个空格而已。

谢谢。

+0

你能澄清你的问题?它解析X,但它也解析X?你能举一个更具体的例子吗? – Vicky 2010-05-24 15:12:25

+0

由于您的两个解析字符串示例是相同的,因此很难看到您所问的内容。给出一个不起作用的例子。 – 2010-05-24 15:13:43

+0

我只想解析'ian mceknis blablabla''ian mceknis'。但是当字符串包含更多空间时,解析仍然有效。但我不想要这个。它只能解析并且只能使用指定空格的'ian mceknis'。 'Ian mceknis blablabla'不应该是有效的。我希望你明白我想说的是什么。抱歉。 – jamall55 2010-05-24 15:23:16

回答

2

如果你希望它拒绝后一个例子,你将不得不推出自己的函数来查找/拒绝多个空格。

但我的猜测是,你真正想要做的是剥离额外的空间。见:How do I trim leading/trailing whitespace in a standard way?

+0

是的,但仍然可以解析字符串。这就是为什么我不能那样做。 – jamall55 2010-05-24 15:38:51

+1

然后,你绝对必须推出自己的预先检查双重空间。你的字符串之前的空格怎么样?这是允许的吗?最后两个空格呢?另外,这是一个功课问题?因为从可用性的角度来看,限制输入选项通常是不太理想的。 – 2010-05-24 19:30:48

0

你不能这样做只使用sscanf(),它具有非常基本的功能。如果你真的需要执行这个(你呢?),regular expressions可能在这里更合适。

-1

根据sscanf定义,这是绝对不可能的。为了得到所需的结果,我会手动读取文本变量,搜索两个后续的空白字符。如果找到,用0替换第二个空白字符,然后调用sscanf。

+0

用'0'替换第二个空白字符只会导致'company'在给定的例子中被设置为'0mceknis'。 -1。 – 2010-05-24 15:32:58

+0

j_random_hacker:你知道0和'0'之间的区别吗? – 2010-05-25 08:24:39

+0

我想知道你是否意味着0,如在nul字符(全部关闭)。在给出的例子中,它会在'mceknis'之前终止字符串(即输入字符串现在是'ian',最后有一个空格),所以'sscanf()'会失败。 – 2010-05-25 10:32:34

0

它不是最干净的,但这是我如何做一个项目。基本上,而不是在格式化的字符串中有一个空格,它最多需要两个空格(你可以改变它也处理标签或任何其他)。如果只有一个空格,那么第二个字符仍然为空,如果它不为空,那么它将被覆盖。

所以我会改变:

sscanf(text, "%s %s", name, company); 

到:

char space[2] = "\0\0" 
sscanf(text, "%s%2[ ]%s", name, space, company); 
if(space[1] != '\0') { 
    //there was an extra space, handle it however 
}