2011-05-06 36 views
5

Puedo leer una cadena con std::cin pero no sé leer con una función withscanf(). ¿Cómo puedo cambiar el código a continuación para usar scanf()?¿Cómo puedo leer una cadena con scanf() en C++?

string s[20][5]; 

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

¿Por qué quieres hacer eso? Tu solución parece estar bien. –

+0

http://linux.die.net/man/3/scanf –

+2

¿Por qué querrías usar scanf? –

Respuesta

10

El uso de la función C scanf() requiere el uso de cadenas de caracteres C. Este ejemplo utiliza una cadena C temporal tmp, luego copia los datos en el destino std::string.

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

pregunta noob: si usa "% 100s", ¿qué almacenará cuando ingrese una cadena de menos de 100 caracteres? (porque se le dice que almacene 100 caracteres) –

+0

@HaiPhong: 'tmp' contendrá el contenido de la cadena ingresada. El '% 100s' significa que se almacenará un * máximo * de 100 caracteres (más el terminador NUL). –

3

No se puede, al menos no directamente. La función scanf() es una función C, no sabe acerca de std::string (o clases).

2

No estoy seguro de por qué necesita utilizar scanf y Greg ya cubrió cómo. Pero puedes hacer uso de vectores en lugar de una matriz de cadenas regular.

He aquí un ejemplo del uso de un vector que también utiliza scanf (con C++ 0x gama basada en los bucles):

#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')); 
     } 
    } 
} 

Pero, eso supone que desea rellenar todos los elementos con el fin de la entrada del usuario, que es diferente de tu ejemplo.

También, getline (cin, some_string) si a menudo es mucho mejor que cin >> o scanf(), dependiendo de lo que quieras hacer.

Cuestiones relacionadas