2010-05-24 135 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 
}