2013-11-23 17 views
17

Wie der Titel schon sagt, bin ich neugierig, ob es eine Möglichkeit gibt, eine C++ - Zeichenfolge mit scanf zu lesen.C++ - Zeichenfolge mit scanf lesen

Ich weiß, dass ich jedes Zeichen lesen kann und es in den verdienten Zeichenfolge einzufügen, aber ich würde gerne etwas wollen:

string a; 
scanf("%SOMETHING", &a); 

gets() auch nicht funktioniert.

Vielen Dank im Voraus!

+7

Nur neugierig, warum können Sie nicht cin oder getline? –

+0

Auf einigen Compilern verwenden Streams eine Menge Zeit ... und ich schreibe für einen Compiler wie diesen hier. –

+1

@Vlad: Sie sollten Ihr Programm mit 'std :: ios_base :: syc_with_stdio (false);' starten wenn das Lesen von der Standardeingabe zu langsam ist. –

Antwort

13

Es gibt keine Situation verwendet werden gets() ist! Es ist immer falsch zu verwenden gets() und es wird von C11 entfernt und aus C++ 14 entfernt.

scanf() unterstützt keine C++ Klassen. Sie können jedoch das Ergebnis von scanf() in eine std::string speichern:

std::string str(100, ' '); 
if (1 == scanf("%*s", &str[0], str.size())) { 
    // ... 
} 

ich über die Art und Weise nicht ganz sicher bin, dass die Pufferlänge in scanf() und angeben, in Reihenfolge die Parameter gehen (es gibt eine Chance, dass die Parameter &str[0] und str.size() müssen umgekehrt werden, und ich kann eine . in der Formatzeichenfolge fehlen). Beachten Sie, dass das Ergebnis std::string ein abschließendes Nullzeichen enthält und seine Größe nicht geändert hat.

Natürlich würde ich einfach if (std::cin >> str) { ... } verwenden, aber das ist eine andere Frage.

+0

Sind Sie sicher, dass Ihr Code kompiliert? Ich bekomme einen Kompilierungsfehler mit C++ 98 und C++ 11 –

+0

@Vlad: Ich würde denken, dass der Code kompilieren sollte unter der Annahme, dass Sie '' und '' enthalten und natürlich in einer Funktion sitzt. Welche Fehlermeldungen erhalten Sie? –

+0

@Vlad: OK, ich sehe: scheint 'std :: string' deklariert keinen Konstruktor, der nur eine Größe nimmt. Die Verwendung von 'std :: string str (100, '');' behebt dieses Problem. –

20

dies funktionieren kann, unter denen

char tmp[101]; 
scanf("%100s", tmp); 
string a= tmp; 
+3

Ich wusste nicht, dass ich eine C++ - Zeichenfolge mit einem char [] initialisieren kann .. vielen Dank! :) –

-3
string temp; 
scanf("%s",&temp.c_str()); 

ich hoffe, es wird funktionieren!

+1

Das ist keine gute Idee.'scanf' erwartet einen nichtkonstanten Zeiger auf char. – dreamlax