일부 범위에 대해 C ++에서 문자열을 제대로 반환 할 수 없습니다.

화요일

포인터와 함수를 사용하여 문자열의 반대를 반환하는 하나의 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);
}

Vlad / 모스크바

함수 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C에서 .mat 파일 읽기 : 변수를 읽을 수 있습니다. 그러나 제대로 반환 할 수 없습니다

분류에서Dev

std :: hash <std :: string>은 다른 문자열에 대해 동일한 값을 반환 할 수 있습니까?

분류에서Dev

반환 된 문자열을 서비스에서 C #의 int로 변환 할 수 없습니다.

분류에서Dev

내부에 유니 코드 문자가있는 문자열을 제대로 표시 할 수 없습니다.

분류에서Dev

ValueError : matlab에서 저장된 .txt 파일에 대해 jupyter에서 문자열을 float로 변환 할 수 없습니다.

분류에서Dev

뷰에서 뷰 모델을 반환 할 수 없습니다. 모델 속성이 제대로 반환됩니다.

분류에서Dev

파이썬에서 문자열을 제대로 결합 할 수 없습니다.

분류에서Dev

16 진수 문자열을 C에서 부호없는 문자로 변환하는 방법을 이해할 수 없습니까?

분류에서Dev

S3에 대한 저장 파일을 문자열로 변환 할 수 없습니다.

분류에서Dev

문자열을 정수로 변환 할 수 없습니다 (CSV 파일에서)-오류 입력 문자열 : "4"

분류에서Dev

일부 요소에서 이름을 제대로 구문 분석 할 수 없습니다.

분류에서Dev

영역이 Xcode에서 대문자에 대해 제대로 정렬 할 수 없습니다.

분류에서Dev

레일에서 세션을 제대로 삭제할 수 없습니다.

분류에서Dev

문자열을 ... Swift에서 문자열로 변환 할 수 없습니다.

분류에서Dev

C ++에서이 함수의 반환을 이해할 수 없습니다.

분류에서Dev

C ++에서이 함수의 반환을 이해할 수 없습니다.

분류에서Dev

""파일을 열 수 없기 때문에 대량로드 할 수 없습니다. 운영 체제 오류 코드 5 (액세스가 거부되었습니다.)

분류에서Dev

배열의 인덱스 범위로 인해 bash에서 새 줄을 반복 할 수 없습니다.

분류에서Dev

일부 요소의 값에 대해 .join ()을 호출 할 수 없습니다.

분류에서Dev

$ +없이 괄호에서 일치하는 부분을 대체하고 반환 할 수 있습니까?

분류에서Dev

API에서 일부 Facebook 광고에 대한 예상 도달 범위를 검색 할 수 없습니다.

분류에서Dev

nginx에서 위치 지시문을 제대로 구성 할 수 없습니다.

분류에서Dev

문자열에서 문자로 변환 할 수 없습니다.

분류에서Dev

문자열에서 문자로 변환 할 수 없습니다.

분류에서Dev

함수 내부에서 값을 반환 할 수 없습니다.

분류에서Dev

API 플랫폼 및 graphql에서 nullable이 아닌 필드에 대해 null을 반환 할 수 없습니다.

분류에서Dev

클라우드 구문 분석 : 열에서 최대 값의 쿼리 값을 반환 할 수 없습니다.

분류에서Dev

Android Volley가 Flask에서 문자열을 반환하기 위해 GET 메서드에 대한 Flask 로컬 호스트 주소에 연결할 수없는 것 같습니다.

분류에서Dev

sqlite에 대해 제대로 저장할 수 없습니다.

Related 관련 기사

  1. 1

    C에서 .mat 파일 읽기 : 변수를 읽을 수 있습니다. 그러나 제대로 반환 할 수 없습니다

  2. 2

    std :: hash <std :: string>은 다른 문자열에 대해 동일한 값을 반환 할 수 있습니까?

  3. 3

    반환 된 문자열을 서비스에서 C #의 int로 변환 할 수 없습니다.

  4. 4

    내부에 유니 코드 문자가있는 문자열을 제대로 표시 할 수 없습니다.

  5. 5

    ValueError : matlab에서 저장된 .txt 파일에 대해 jupyter에서 문자열을 float로 변환 할 수 없습니다.

  6. 6

    뷰에서 뷰 모델을 반환 할 수 없습니다. 모델 속성이 제대로 반환됩니다.

  7. 7

    파이썬에서 문자열을 제대로 결합 할 수 없습니다.

  8. 8

    16 진수 문자열을 C에서 부호없는 문자로 변환하는 방법을 이해할 수 없습니까?

  9. 9

    S3에 대한 저장 파일을 문자열로 변환 할 수 없습니다.

  10. 10

    문자열을 정수로 변환 할 수 없습니다 (CSV 파일에서)-오류 입력 문자열 : "4"

  11. 11

    일부 요소에서 이름을 제대로 구문 분석 할 수 없습니다.

  12. 12

    영역이 Xcode에서 대문자에 대해 제대로 정렬 할 수 없습니다.

  13. 13

    레일에서 세션을 제대로 삭제할 수 없습니다.

  14. 14

    문자열을 ... Swift에서 문자열로 변환 할 수 없습니다.

  15. 15

    C ++에서이 함수의 반환을 이해할 수 없습니다.

  16. 16

    C ++에서이 함수의 반환을 이해할 수 없습니다.

  17. 17

    ""파일을 열 수 없기 때문에 대량로드 할 수 없습니다. 운영 체제 오류 코드 5 (액세스가 거부되었습니다.)

  18. 18

    배열의 인덱스 범위로 인해 bash에서 새 줄을 반복 할 수 없습니다.

  19. 19

    일부 요소의 값에 대해 .join ()을 호출 할 수 없습니다.

  20. 20

    $ +없이 괄호에서 일치하는 부분을 대체하고 반환 할 수 있습니까?

  21. 21

    API에서 일부 Facebook 광고에 대한 예상 도달 범위를 검색 할 수 없습니다.

  22. 22

    nginx에서 위치 지시문을 제대로 구성 할 수 없습니다.

  23. 23

    문자열에서 문자로 변환 할 수 없습니다.

  24. 24

    문자열에서 문자로 변환 할 수 없습니다.

  25. 25

    함수 내부에서 값을 반환 할 수 없습니다.

  26. 26

    API 플랫폼 및 graphql에서 nullable이 아닌 필드에 대해 null을 반환 할 수 없습니다.

  27. 27

    클라우드 구문 분석 : 열에서 최대 값의 쿼리 값을 반환 할 수 없습니다.

  28. 28

    Android Volley가 Flask에서 문자열을 반환하기 위해 GET 메서드에 대한 Flask 로컬 호스트 주소에 연결할 수없는 것 같습니다.

  29. 29

    sqlite에 대해 제대로 저장할 수 없습니다.

뜨겁다태그

보관