2011-05-06 51 views
5

我可以用std::cin讀取一個字符串,但我不知道如何用withscanf()讀取一個字符串。我如何改變下面的代碼來使用scanf()?如何在C++中使用scanf()讀取字符串?

string s[20][5]; 

for (int i=1;i<=10;i++) 
{ 
    for (int j=1;j<=3;j++) 
    { 
     cin>>s[i][j]; 
    } 
} 
+4

爲什麼你想這樣做?你的解決方案似乎很好 – 2011-05-06 11:08:17

+0

http://linux.die.net/man/3/scanf – 2011-05-06 11:08:52

+2

爲什麼要使用scanf? – 2011-05-06 11:14:19

回答

10

使用C scanf()函數需要使用C字符串。本示例使用臨時C字符串tmp,然後將數據複製到目標std::string

char tmp[101]; 
scanf("%100s", tmp); 
s[i][j] = tmp; 
+2

noob問題:如果您使用「%100s」,當您輸入少於100個字符的字符串時,它將存儲什麼? (因爲要存儲100個字符) – 2013-01-08 07:40:50

+0

@HaiPhong:'tmp'將包含輸入字符串的內容。 '%100s'表示將存儲100個字符的*最大*(加上NUL終止符)。 – 2013-01-08 07:42:26

3

你不能,至少不能直接。函數scanf()是C函數,它不知道std::string(或類)。

2

不知道爲什麼你需要使用scanf和Greg已經介紹瞭如何。但是,您可以使用矢量而不是常規字符串數組。

下面是使用也使用的scanf(帶的C++ 0x範圍爲基礎的循環)一個矢量的一個示例:

#include <string> 
#include <vector> 
#include <cstdio> 
using namespace std; 

int main() { 
    vector<vector<string>> v(20, vector<string>(5, string(101, '\0'))); 
    for (auto& row: v) { 
     for (auto& col: row) { 
      scanf("%100s", &col[0]); 
      col.resize(col.find('\0')); 
     } 
    } 
} 

但是,這假定要填充在所有元件,以便從輸入來自用戶,這與您的示例不同。

另外,getline(cin,some_string)如果經常比cin >>或scanf()更好,這取決於你想要做什麼。

相關問題