2016-11-22 39 views
-8

我有一個C程序,從鍵盤讀取,像這樣:的C++等價的C的格式字符串的

scanf("%*[ \t\n]\"%[^A-Za-z]%[^\"]\"", ps1, ps2); 

爲了更好地理解這是什麼指令呢,讓我們分裂格式字符串如下:

=>讀取所有空格,製表符和換行符([ \t\n]),但不會將它們存儲在任何變量中(因此爲'*'),並將繼續讀取,直到遇到雙引號(\"),但雙引號不是輸入。

一旦scanf()找到雙引號,將所有不是字母的字符讀入ps1。這是通過...'來完成的。'

%[^A-Za-z] =>輸入任何不是大寫字母'A'到'Z'和小寫字母'a'到'z'的字母。

%[^\"]\" =>讀取的所有剩餘的字符爲止,但不包括一個雙引號到PS2([^\"])和字符串必須以雙引號(\")結束,然而,雙引號沒有輸入。

有人能告訴我如何做同樣的事情在C++

謝謝

+0

看來,我所說的一些人不清楚! 'cin存在於C++中以代替C的scanf,否則我們不需要'cin','cout'以及C++引入的所有特性。 – user7140484

+0

@AndrewHenle,所以你的意思是我不能從控制檯讀取一些限制!你說過嗎?對不起,但我不相信。 – user7140484

+0

@ 0x5453我不想在C++中引用scanf。我想在沒有cstdio的情況下也這樣做 – user7140484

回答

3

C++支持scanf功能。沒有簡單的選擇,特別是如果你想複製scanf()的確切語義與所有的怪癖。

不過請注意,你的代碼中有幾個問題:

  • 你不及格的最多字符數讀入ps1ps2。任何足夠的輸入序列都會導致緩衝區溢出併產生可怕的後果

  • 您可以簡化格式字符串中只有一個空格的第一個格式%*[ \t\n]。這也將允許不存在空白字符的情況。如目前所寫,如果"之前沒有whitspace字符,scanf()將失敗並返回0

  • 同樣,如果沒有非字母或如果沒有其他字符第二"之前跟隨,scanf將返回的01短計數和離開一個或處於不確定狀態兩者目的地陣列。

出於所有這些原因,它會在C更安全和可預見的先讀一行輸入與fgets()和使用sscanf()或手工解析線。

在C++中,您一定要使用<regex.h>中定義的std::regex包。