Artículo anterior:
En el estándar C ++ 11 y antes, aún puede usar la gets
lectura, pero C ++ 14 elimina oficialmente gets
esta lectura insegura. Debido a que la lectura ignora automáticamente los espacios, se necesitan otras funciones de lectura para procesar cadenas con espacios.
Método de lectura específico:
Uno, matriz de caracteres
A,std::cin.getline(str, size)
#include<iostream>
int main() {
char str[100];
std::cin.getline(str, 100);
std::cout << str << "\n";
return 0;
}
Significa que puede comenzar desde el índice 0 00 comienza a leer como máximo99 999 9 caracteres, el último está reservado'\0'
getline
para saltos de línea, dejará de leer y filtrará los saltos de línea.
B,std::cin.get(str, size)
#include<iostream>
int main() {
char str[100];
std::cin.get(str, 100);
std::cout << str << "\n";
return 0;
}
Nota:
cin.get()
y cin.get(str, size)
cin.get()
se puede leer en cualquier carácter que
cin.get(str, size)
no sea un ajuste de filtro que diga que un salto de línea ha terminado, y los saltos de línea aún se perderán en el búfer.
En el siguiente programa, un carácter de nueva línea que permanece en el búfer get
invalidará todas las siguientes lecturas.
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char s1[10], s2[10], s3[10];
cin.get(s1, 10);
cin.get(s2, 10);
cin.get(s3, 10);
cout << strlen(s1) << " : "<< s1 << "\n";
cout << strlen(s2) << " : "<< s2 << "\n";
cout << strlen(s3) << " : "<< s3 << "\n";
return 0;
}
Producción:
100
3 : 100
0 :
0 :
Solución: una vez get
completada la lectura, úsela de nuevo get
para filtrar manualmente los saltos de línea:
cin.get(str, 100).get();
C,scanf("%[^\n]", str)
Y get
similar, no envuelve el filtro: la operación específica es la siguiente.
#include<cstdio>
int main()
{
char str[100];
scanf("%[^\n]", str); getchar();
printf("%s\n", str);
return 0;
}
Para asegurarse de que no haya errores similares, se recomienda que todos scanf
ellos vayan seguidos de un getchar
carácter de nueva línea de filtro.
D,fgets(str, size, stdin)
Para resolver gets
el problema de seguridad fgets
de lectura, se agrega la longitud máxima de lectura size
, pero fgets
se leerá un carácter de nueva línea. como sigue:
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char str[10];
fgets(str, 10, stdin);
for(int i = 0; i < strlen(str); ++i) {
if(str[i] == '\n') printf("x");
else printf("%c", str[i]);
}
return 0;
}
resultado de la operación:
input:
123
output:
123x
Entonces, si no necesita un carácter de nueva línea, puede str[strlen(str)-1]='\0'
eliminar el carácter de nueva línea.
Dos, string
clase
A,getline(std::cin, s)
#include<iostream>
#include<string>
int main()
{
std::string s;
getline(std::cin, s);
std::cout << s << "\n";
return 0;
}