문자열 반전에 대해 학습하는 Niuke(자세한 fgets 함수, 공백이 포함된 문자열을 읽는 방법)

주제 요구사항:

 프로세스 분석: (대략적인 아이디어)

 특정 코드:

#include <stdio.h>
#include <string.h>
/*逆序字符串*/
void reverse(char* begin,char* end)
{
	while (begin < end)
	{
		char temp = *begin;
		*begin = *end;
		*end = temp;
		begin++;
		end--;
	}
}
int main()
{
	char arr[101];
	fgets(arr, 101, stdin);
	int len = strlen(arr);
	arr[len - 1] = '\0';//注意,fgets函数在读取时会把\n也存到字符串中
						//要把最后一个字符改为\0

	/*实现倒置字符串*/
	reverse(arr, arr + len - 2);

	/*实现每个单词的逆序*/
	char* start = arr;//存储每个单词的首地址
	char* cur = arr;//用于存储当前的地址
	while (*cur)
	{
		while (*cur != ' ' && *cur!='\0')
		{
			cur++;//最后cur会指向空格(最后一个单词会指向\0)
		}
		reverse(start, cur - 1);
		start = cur + 1;
		if (*cur == ' ')//若*cur在等于\0之后再++,他会指向一个随机值,从而使循环继续
		{
			cur++;//使其指向下一个单词的首地址
		}
	}
	printf("%s", arr);

	return 0;
}

참고: 이 질문의 작성자는 scanf 함수를 사용하여 처음부터 문자열을 읽었습니다. 그는 scanf 함수가 공백을 읽을 때 자동으로 문자열 읽기를 종료한다는 사실을 잊어버렸습니다. 결과적으로 정답을 얻을 수 없습니다. 다음에 어떻게 쓸지 그것은 끔찍한 손실입니다. 모두가 그것으로부터 배울 수 있기를 바랍니다.

그렇다면 공백이 포함된 문자열을 읽는 데 scanf 함수를 사용할 수 없는 경우 어떤 방법을 사용할 수 있습니까? 저자는 아래 세 가지 방법을 설명합니다.

1.fgets 함수(핵심 설명)

원기:

 

fgets 함수를 관찰하면, 그와 scanf 함수의 가장 큰 차이점은 fgets 함수가 문자열의 끝 기호 '\0'도 배열 str의 요소로 저장한다는 점임을 알 수 있습니다! 문자열을 반전시키는 코드에 이 상황에 대한 해결책이 있습니다.

 

2. scanf("%[^\n]s", arr) 기능을 사용하세요

        이는 scanf 함수의 최적화된 버전으로 이해될 수 있으며, 이를 통해 scanf는 공백이 포함된 문자열을 읽을 수 있습니다.

역 문자열 코드에서 scanf("%[^\n]s", arr); 함수를 사용하세요.

 

3.gets 또는 gets_s 함수

        C 언어를 처음 배울 때 자주 사용하는 함수이기 때문에 많은 사람들이 가장 먼저 떠올리는 함수는 gets 함수일 수 있지만, C99 표준에서는 보안 문제로 인해 이 함수가 폐기되었습니다. it may 여전히 사용할 수 있지만 대부분의 컴파일러에서는 더 이상 사용할 수 없으므로 이 방법의 범위가 너무 좁으므로 앞으로는 이 기능을 사용하지 않는 것이 좋습니다.

추천

출처blog.csdn.net/Mylvzi/article/details/130875905