C ++ 14 이후에 공백이있는 문자열을 읽는 방법

이전 기사 :
C ++ 11 표준 및 이전 버전에서는 여전히 gets읽기를 사용할 수 있지만 C ++ 14는 gets이 안전하지 않은 읽기를 공식적으로 삭제 합니다. 읽기는 자동으로 공백을 무시하기 때문에 공백이있는 문자열을 처리하려면 다른 읽기 기능이 필요합니다.

특정 독서 방법 :

하나, 문자 배열


ㅏ,std::cin.getline(str, size)

#include<iostream>
int main() {
    
    
	char str[100];
	std::cin.getline(str, 100);
	std::cout << str << "\n";
	return 0;
}

인덱스 0 0 에서 시작할 수 있음을 의미합니다.099 99까지 읽기 시작9 9 자, 마지막 문자는'\0'
getline줄 바꿈 용으로 예약되어있으며 읽기를 중지하고 줄 바꿈을 필터링합니다.


비,std::cin.get(str, size)

#include<iostream>
int main() {
    
    
	char str[100];
	std::cin.get(str, 100);
	std::cout << str << "\n";
	return 0;
}

참고 :
cin.get()cin.get(str, size)
cin.get()모든 문자로 읽을 수 있습니다
cin.get(str, size)줄 바꿈이 끝난 읽고, 줄 바꿈은 여전히 버퍼에 손실됩니다하지 필터 랩.

다음 프로그램에서 버퍼에 남아있는 개행 문자는 모든 다음 get판독 값을 무효화 합니다 .

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

산출:

100
3 : 100
0 :
0 :

솔루션 : get읽기가 완료된 다시 사용 get하여 줄 바꿈을 수동으로 필터링 하십시오 .
cin.get(str, 100).get();


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

그리고 get필터를 감싸지 않습니다. 구체적인 작업은 다음과 같습니다.

#include<cstdio>
int main()
{
    
    
	char str[100];
	scanf("%[^\n]", str); getchar();
	printf("%s\n", str);
	return 0;
}

유사한 오류가 없는지 확인하려면 모든 오류 scanf뒤에 getchar필터 개행 문자 가 오는 것이 좋습니다 .


디,fgets(str, size, stdin)

getsread-in 보안 문제 를 해결하기 위해 read-in fgets의 최대 길이를 추가 size하지만 fgets개행 문자를 읽습니다. 다음과 같이 :

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

작업 결과 :

input:
123

output:
123x

따라서 개행 문자가 필요하지 않으면 개행 문자를 str[strlen(str)-1]='\0'제거 할 수 있습니다 .


두, string클래스

ㅏ,getline(std::cin, s)

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

추천

출처blog.csdn.net/weixin_43900869/article/details/114308096