이상한 출력을 얻는 C 역 문자열 함수

Gilianzz

포인터를 이해하고 역 문자열 함수를 만들려고합니다.
암호:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *reverseString(char string[]){
    int i;
    int len = strlen(string);
    char reversedString[len];  
    for (i = 0; i < len; i++){
        reversedString[i] = string[(len - 1) - i];
    }
    printf("%s", reversedString); //print it out

    return reversedString; //return pointer to first element of reversed string
}

int main (){
    char string[6] = "kitten";
    int i;
    char *p = reverseString(string);
    return (0);

}

내 목표는 문자열 "kitten"을 뒤집어 뒤집은 문자열을 인쇄하는 것입니다. 출력 "nettik"을 기대하지만 "nettik ..."을 얻습니다. 이 이상한 캐릭터가 나오는 이유는 무엇입니까?

중지! 우선, 초보자가 포인터에 대해 배울 때 자주 범하는 고전적인 실수를하고 있습니다. 당신이 쓸 때 :

char *reverseString(char string[]) {
    ...
    char reversedString[len];
    return reversedString;
}

당신은 그것이 있던 위치에 대한 포인터를 반환하고 있습니다 : 당신이 함수를 떠날 때 메모리가 실제로 해제되므로 반전 된 문자열이 포함되어 있다고 생각하는 메모리가 이미 다른 것에서 재사용되지 않는다는 보장은 없습니다. 이렇게하면 프로그램이 치명적으로 실패합니다.

그러나 반환하기 전에 반전 된 문자열을 인쇄하므로 아직 큰 문제가 아닙니다 . 그렇다면 여기서 잘못된 것은 문자열이 제대로 0으로 끝나지 않는다는 것입니다.

C 언어의 문자열은 최종 '\0'바이트 를 저장할 공간이 필요 char string[6] = "kitten";합니다 { 'k', 'i', 't', 't', 'e', 'n', '\0' }. 0으로 끝나는 문자열을 보유하기에 너무 작습니다 . 마찬가지로를 호출 할 때를 사용 printf("%s", reversedString)하여 문자열을 제대로 종료하지 않았 '\0'으므로 문자열 printf의 끝을 계속 찾고 reversedString할당 된 메모리에있는 정크를 출력합니다 .

다음을 시도해야합니다.

  • 함수 반환 만들기 void,
  • 7원래 문자열에 바이트 할당 ,
  • strlen(string) + 1새 문자열에 대해 (또한 7) 바이트 할당
  • '\0'이전 문자열을 반대로 반복 한 후 새 문자열 끝에 a 씁니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

c의 문자열 배열 함수에서 출력을 얻지 못함

문자 배열 C ++로 이상한 출력 얻기

역 문자열 함수 C ++

역 함수가 C의 원래 문자열 값을 변경하는 이유는 무엇입니까?

특수 문자가있는 C ++ 문자열의 출력을 이해할 수 없습니다.

C에서 함수 인수로 배열의 이상한 출력

문자열을 이미 데이터를 출력하는 함수로 바꾸기

문자열이 아닌 출력을 반환하는 String.replace 함수

정규식을 통한 문자열 구문 분석 후 원하는 출력을 얻을 수 없음

C # : webmethod 매개 변수와 동일한 결과를 얻기 위해 json 문자열을 역 직렬화하는 방법은 무엇입니까?

'\ n'또는 endl이없는 C ++ 출력 문자열은 문자열 끝에 '#'을 출력합니다.

다음 프로그램(c 문자열을 함수에 전달)이 원하는 출력을 생성하지 않는 이유는 무엇입니까?

함수 이름을 문자열로 얻는 방법?

함수의 이름을 문자열로 얻는 방법?

while 루프를 사용하여 C #에서 문자열을 반전하고 있습니다. 올바른 출력을 얻고 있지만 for 루프와 함께 사용하는 동일한 논리를 사용하면 출력이 잘못되었습니다.

PHP에서 strlen () 함수를 사용하여 동일한 문자열에 대해 두 개의 다른 출력을 얻는 이유는 무엇입니까?

중첩 된 맵과 문자열을 연결하는 동안 적절한 출력을 얻을 수 없습니다.

C에서 2D 문자 행렬을 할당하는 이상한 출력

입력 문자열을 사용하여 C++에서 변수 이름을 호출하는 방법

다른 출력을 얻는 조인 함수에 대한 Python 질문

이름이 문자열 안에 있는 함수에 대한 함수 호출 만들기 - C++

C # txt에 문자열이 포함되어 있는지 확인하고 그 아래 줄을 출력합니다.

파이썬에서 문자열 형식을 사용하여 원하는 출력을 얻을 수 없습니다.

전역 또는 C에서 함수 입력 변경없이 함수 내부의 배열에 변수 할당

이상한 결과를주는 벡터 배열의 역 출력

NativeCall. C 함수의 매개 변수로 문자열을 얻는 방법

전역 변수와 내부 함수에서 널 (null) 문자열을 얻기

함수 매개 변수에 번역 가능한 문자열을 추가하는 방법은 무엇입니까?

빈 문자열을 반환하는 문자열 함수 C ++

TOP 리스트

  1. 1

    C # 16 진수 값 0x12는 잘못된 문자입니다.

  2. 2

    Matlab의 반복 Sortino 비율

  3. 3

    Python의 csv 파일에서 첫 번째 열 삭제

  4. 4

    개체 참조가 개체의 인스턴스로 설정되지 않았습니까? (예외 오류 ~ ASP.NET MVC)

  5. 5

    atob은 인코딩 된 base64 문자열을 디코딩하지 않습니다.

  6. 6

    EventEmitter <string>의 컨텍스트 'this'가 Observable <string> 유형의 'this'메서드에 할당되지 않았습니다.

  7. 7

    병합 셀을 사용하여 워크 시트의 데이터 필터링

  8. 8

    PhpStorm 중단 점에서 변수 값을 볼 수 없습니다.

  9. 9

    jQuery에서 이벤트 핸들러를 제거하는 가장 좋은 방법은 무엇입니까?

  10. 10

    `@ Transactional`이 있음에도 불구하고 이러한 데이터베이스 수정 사항이 롤백되지 않는 이유는 무엇입니까?

  11. 11

    ssh를 사용하여 원격에서 로컬로 파일 복사

  12. 12

    종속 사용자 정의 Lightning 선택 목록 Level2 및 Level3을 설정한 다음 Lightning 구성 요소에서 Level2를 재설정하지만 Level2 캐시 데이터가 저장됨

  13. 13

    2 개의 이미지를 단일 평면 이미지로 결합

  14. 14

    팝업처럼 위젯을 표시하는 방법

  15. 15

    [해결] 쿠키 설정 SameSite = Chrome / JSP, JAVASCRIPT에서 작동하지 않습니다.

  16. 16

    버튼 클릭을 기반으로 특정 CSS 클래스를 추가하는 방법은 무엇입니까?

  17. 17

    React 구성 요소가 자동으로 초기 상태로 다시 렌더링됩니다.

  18. 18

    연결된 서버 쿼리는 작동하지만 동일한 OPENQUERY는 "sys.servers에서 서버 'SERVER'를 찾을 수 없습니다.

  19. 19

    파일 2의 파일 1에서 동일한 줄을 조건으로 바꿉니다.

  20. 20

    아이디어 Intellij : 종속성 org.json : json : 20180813을 찾을 수 없음, maven에서 org.json 라이브러리를 가져올 수 없음

  21. 21

    상황에 맞는 메뉴 색상

뜨겁다태그

보관