Cómo leer una línea de cadena con espacios después de C ++ 14

Artículo anterior:
En el estándar C ++ 11 y antes, aún puede usar la getslectura, pero C ++ 14 elimina oficialmente getsesta 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'
getlinepara 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 getinvalidará 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 getcompletada la lectura, úsela de nuevo getpara filtrar manualmente los saltos de línea:
cin.get(str, 100).get();


C,scanf("%[^\n]", str)

Y getsimilar, 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 scanfellos vayan seguidos de un getcharcarácter de nueva línea de filtro.


D,fgets(str, size, stdin)

Para resolver getsel problema de seguridad fgetsde lectura, se agrega la longitud máxima de lectura size, pero fgetsse 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, stringclase

A,getline(std::cin, s)

#include<iostream>
#include<string>
int main()
{
    
    
	std::string s;
	getline(std::cin, s);
	std::cout << s << "\n";
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43900869/article/details/114308096
Recomendado
Clasificación