주제 요구사항:
프로세스 분석: (대략적인 아이디어)
특정 코드:
#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 여전히 사용할 수 있지만 대부분의 컴파일러에서는 더 이상 사용할 수 없으므로 이 방법의 범위가 너무 좁으므로 앞으로는 이 기능을 사용하지 않는 것이 좋습니다.