C ++의 함수에서 문자열을 반환 할 때 분할 오류

jfhfhf839

수업에 오류가 있습니다. 나는 그것이 단순하다고 생각합니다. 아마도 C ++에서 문자열이 어떻게 작동하는지 이해하지 못할 수도 있습니다. 내 함수는 로컬 std :: string을 다른 std :: string으로 반환하려고 시도하지만 문자열을 가져 오는 대신 함수가 반환 된 후 분할 오류가 발생합니다. 이것은 내 코드입니다.

    TestClass::TestClass(std::string a, std::string b)
    {
        m_a = a;
        m_b = b;
    }

    std::string TestClass::stringHandler()
    {
        const char myTemplate[] = "a=%s,b=%s";
        char formattedString[strlen(myTemplate) + m_a.length() + m_b.length()];
        sprintf( formattedString, myTemplate, m_a.c_str(), m_b.c_str());
        std::cout << "formattedString= " << formattedString << "\n";
        std::string returnStr(formattedString);
        std::cout << "returnStr=" << returnStr << "\n";
        return returnStr;
    }

    int main(...)
    {
        /* getting a and b from argv */
        TestClass MyClassObj(a, b);
        std::string strRet = MyClassObj.stringHandler();
        std::cout << "Back after stringHandler\n";
        return 0
    }

stringHandler에서 returnStr을 인쇄 할 때 제대로 표시됩니다. 하지만 그 직후에 Segmentation 오류가 발생하고 "Back after stringHandler"가 인쇄되지 않습니다. 마스터 여러분, 내가 뭘 잘못하고 있는지 아는 사람이 있습니까?

MM

몇 가지 문제 :

  • %b 유효한 형식 지정자가 아닙니다.
  • 3 개의 형식 지정자가 %b있지만 (고정 된 경우 !) 2 개의 인수 만 전달했습니다.
  • 에 충분한 메모리를 할당하지 않았습니다 formattedString.
  • 런타임 크기가있는 배열은 C ++에서 불법입니다.

(업데이트 :) OP에 대한 편집 후, 이들 중 처음 세 개가 수정되었으므로 컴파일러에도 런타임 배열 크기에 대한 확장이있는 경우이 코드는 segfault를 유발하지 않습니다.

가장 간단한 수정은 다음과 같이 작성하는 것입니다.

std::string returnStr = "a=" + m_a + ",b=" + m_b;

그러나 printf서식 을 고수하고 싶다고 가정하면 여기에 한 가지 방법이 있습니다. 정확한 공간을 계산하고 계산하는 것은 가능하지만 취약합니다. .NET을 변경하면 버퍼 오버플로가 발생하기 쉽습니다 myTemplate.

한 가지 계획은 많은 공간을 할당하는 것입니다. 보다 강력한 방법은 snprintf먼저 버퍼 크기를 결정하는 데 사용 하는 것입니다 .

char const myTemplate[] = "a=%s,b=%s";
size_t expect_len = std::snprintf(NULL, 0, myTemplate, m_a.c_str(), m_b.c_str());

if ( expect_len == -1 )
    throw std::runtime_error("snprintf failed");

std::vector<char> buffer(expect_len + 1);
std::snprintf(&buffer[0], buffer.size(), myTemplate, m_a.c_str(), m_b.c_str());

std::string returnStr(buffer);

11 ++ C에서 당신은 실제로 수 snprintf직접적으로 returnStr.

명확하게 말하면, 예상하지 못한 내용이 포함 된 printf경우 정의되지 않은 동작을 유발할 수 있으므로 전체 아이디어는 매우 안전 myTemplate하지 않습니다. (런타임에 다른 형식 문자열을 지정할 수 있도록이 방법을 사용했다고 가정합니다.) 따라서주의해서 사용하십시오.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C의 함수에 의해 수정 된 문자열 배열에 액세스 할 때 분할 오류

분류에서Dev

행렬 곱셈을 수행 할 때 C ++의 분할 오류

분류에서Dev

C #에서 문자열을 double로 변환 할 때 오류 발생

분류에서Dev

C의 스레드에 여러 값을 반환 할 때 오류 발생

분류에서Dev

Android : doInBackground에서 간단한 문자열을 반환 할 때 이상한 오류

분류에서Dev

내 구조체의 문자 멤버에 값을 할당 할 때 C 분할 오류

분류에서Dev

ArrayList의 문자열을 int로 변환 할 때 Java 오류

분류에서Dev

루비에서 c 함수를 호출 할 때 분할 오류

분류에서Dev

두 개의 람다 함수에서 람다를 반환 할 때 링커 오류

분류에서Dev

정수 포인터 또는 배열의 기본 주소를 반환 할 때 분할 오류

분류에서Dev

C 문자열을 뱉을 때 분할 오류

분류에서Dev

멤버 함수에서 목록을 반환 할 때 세그먼트 오류의 원인은 무엇입니까?

분류에서Dev

C의 소스 문자열 시작 부분에서 하위 문자열을 추출 할 때 오류가 발생했습니다.

분류에서Dev

strsep / strdup을 사용하여 C 문자열을 구조체 변수로 조작 할 때 C 분할 오류

분류에서Dev

C # : 문자열을 첫 번째 문자로 구분 된 사전으로 변환 할 때 오류 발생

분류에서Dev

주어진 문자에서 문자열을 분할하고 분할 후 문자열 배열을 반환하는 C 함수 구현 (배열 길이와 함께)

분류에서Dev

분할 오류 : argv의 인수를 반복 할 때 11

분류에서Dev

내 임의 ID 생성을 실행할 때 C ++ 분할 오류

분류에서Dev

함수에 대한 포인터를 반환하는 함수를 사용할 때 선언되지 않은 식별자 오류 (Visual Studio의 C ++)

분류에서Dev

C의 char 배열에서 작동하는 재귀 함수의 분할 오류

분류에서Dev

C에서 pthread_join을 사용할 때 분할 오류

분류에서Dev

Ada에서 C 문자열에 액세스 할 때 세분화 오류

분류에서Dev

문자열에서 바이트로 변환 할 때 system.byte [] 오류 C #

분류에서Dev

함수가 반환 될 때 분할 오류

분류에서Dev

문자열 반전을 시도 할 때 발생하는 분할 오류

분류에서Dev

C에서 2 차원 배열을 함수의 매개 변수로 전달할 때 오류 발생

분류에서Dev

함수에서 쌍 내에서 unique_ptr을 반환 한 후 분할 오류

분류에서Dev

마침표 (.)가 포함 된 문자열을 C #에서 Int32로 변환 할 때의 문제

분류에서Dev

Python의 정의에 True / False 값을 반환하려고 할 때 오류 발생

Related 관련 기사

  1. 1

    C의 함수에 의해 수정 된 문자열 배열에 액세스 할 때 분할 오류

  2. 2

    행렬 곱셈을 수행 할 때 C ++의 분할 오류

  3. 3

    C #에서 문자열을 double로 변환 할 때 오류 발생

  4. 4

    C의 스레드에 여러 값을 반환 할 때 오류 발생

  5. 5

    Android : doInBackground에서 간단한 문자열을 반환 할 때 이상한 오류

  6. 6

    내 구조체의 문자 멤버에 값을 할당 할 때 C 분할 오류

  7. 7

    ArrayList의 문자열을 int로 변환 할 때 Java 오류

  8. 8

    루비에서 c 함수를 호출 할 때 분할 오류

  9. 9

    두 개의 람다 함수에서 람다를 반환 할 때 링커 오류

  10. 10

    정수 포인터 또는 배열의 기본 주소를 반환 할 때 분할 오류

  11. 11

    C 문자열을 뱉을 때 분할 오류

  12. 12

    멤버 함수에서 목록을 반환 할 때 세그먼트 오류의 원인은 무엇입니까?

  13. 13

    C의 소스 문자열 시작 부분에서 하위 문자열을 추출 할 때 오류가 발생했습니다.

  14. 14

    strsep / strdup을 사용하여 C 문자열을 구조체 변수로 조작 할 때 C 분할 오류

  15. 15

    C # : 문자열을 첫 번째 문자로 구분 된 사전으로 변환 할 때 오류 발생

  16. 16

    주어진 문자에서 문자열을 분할하고 분할 후 문자열 배열을 반환하는 C 함수 구현 (배열 길이와 함께)

  17. 17

    분할 오류 : argv의 인수를 반복 할 때 11

  18. 18

    내 임의 ID 생성을 실행할 때 C ++ 분할 오류

  19. 19

    함수에 대한 포인터를 반환하는 함수를 사용할 때 선언되지 않은 식별자 오류 (Visual Studio의 C ++)

  20. 20

    C의 char 배열에서 작동하는 재귀 함수의 분할 오류

  21. 21

    C에서 pthread_join을 사용할 때 분할 오류

  22. 22

    Ada에서 C 문자열에 액세스 할 때 세분화 오류

  23. 23

    문자열에서 바이트로 변환 할 때 system.byte [] 오류 C #

  24. 24

    함수가 반환 될 때 분할 오류

  25. 25

    문자열 반전을 시도 할 때 발생하는 분할 오류

  26. 26

    C에서 2 차원 배열을 함수의 매개 변수로 전달할 때 오류 발생

  27. 27

    함수에서 쌍 내에서 unique_ptr을 반환 한 후 분할 오류

  28. 28

    마침표 (.)가 포함 된 문자열을 C #에서 Int32로 변환 할 때의 문제

  29. 29

    Python의 정의에 True / False 값을 반환하려고 할 때 오류 발생

뜨겁다태그

보관