포인터와 함수를 사용하여 문자열의 반대를 반환하는 하나의 C ++ 프로그램을 만들었습니다. 함수 rev의 범위 char p []가 25 (145 미만)와 같이 낮을 때 출력은 ►↕☻ ☺ ♠ ♥와 같고 반전되지 않고 범위가 145보다 높으면 정상 작동합니다. gcc에서 Borland TurboC의 경우 최소 범위는 65 여야합니다. 그렇지 않으면 프로그램이 값을 반전하는 대신 이상한 값을 인쇄합니다.
#include<iostream>
#include<conio.h>
#include<string.h>
#include<stdio.h>
using namespace std;
int main()
{
char str[20];
int l;
char* p1;
//clrscr();
gets(str);
l=strlen(str);
char* rev(char*,int);
p1=rev(str,l);
puts(p1);
return 0;
//getch();
}
char * rev(char* a,int l1)
{
char p[25]; // HERE: higher than 146 is working
int c=0;
for(l1=l1-1;l1>=0;l1--)
{
p[c]=a[l1];
c++;
}
p[c]=NULL;
return(p);
}
함수 rev
배열 에서 함수 char p[25];
의 로컬 객체입니다. 함수를 종료 한 후에는 살아 있지 않으며 일반적으로 파괴 될 수 있습니다. 즉, 함수가 차지하는 메모리를 다른 개체 나 함수에 의해 덮어 쓸 수 있습니다.
따라서이 배열의 첫 번째 문자에 대한 반환 된 포인터는 유효하지 않으며 프로그램에 정의되지 않은 동작이 있습니다.
함수의 배열이 매직 넘버 25와 같은 크기로 정의 된 이유는 명확하지 않습니다. 함수에 전달 된 두 번째 인수가 25보다 크면 메모리가 배열을 넘어서 덮어 쓰기 때문에 문제가 발생합니다.
또한 기능의 디자인이 좋지 않습니다. 함수는 문자열 "제자리"를 반전하거나 역순으로 대상 배열의 소스 배열을 복사합니다.이 경우 대상 배열은 함수 매개 변수 여야합니다.
그리고 C ++ 프로그램에서 C IO 함수를 사용하는 것은 좋지 않습니다. 또한 기능 gets
은 안전하지 않으며 더 이상 C 표준에서 지원하지 않습니다.
함수는 다음과 같이 보일 수 있습니다.
#include <iostream>
#include <cstring>
char * reverse_copy( char *s1, const char *s2 )
{
size_t n = std::strlen( s2 );
size_t i = 0;
for ( ; i < n; i++ ) s1[i] = s2[n - i - 1];
s1[i] = '\0';
return s1;
}
int main()
{
const size_t N = 20;
char str1[N];
char str2[N];
std::cin.getline( str2, N );
std::cout << str2 << std::endl;
std::cout << ::reverse_copy( str1, str2 ) << std::endl;
}
구문을 입력하려면
Hello, Priyal Kumar
그러면 프로그램 출력은
Hello, Priyal Kumar
ramuK layirP ,olleH
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다