2013-04-23 1 views
1

문자열 길이가 이상한 버그가 있습니다. 나는 이것에 아주 새롭다 그래서 아마 나가 잃어버린 기본적인 무언가이다.C의 문자열을 반대로 출력 함

문자 배열 (IE의 첫 번째 문자)에 대한 포인터를 가져 오는 프로그램을 작성하려고합니다. 첫 번째 문자와 동일한 크기의 문자열에 대한 포인터를 반환하지만 문자는 반대로. 예를 들어 컴퓨터는 retupmoC가됩니다. tacocat이 tacocat :

여기에 코드입니다 남아있을 것입니다 :

char* return_flipped_string(char* stringptr) 
{ 
    int i=0,size_of_string=length_of_string(stringptr); 
    char *flipped; 
    flipped=(char *)malloc(size_of_string*sizeof(char)); 
    while(i<size_of_string) 
    { 
     *(flipped+i)=*(stringptr+size_of_string-1-i); 
     i++; 
    } 
    return flipped; 
} 

stringptr는 원래 문자열에 대한 포인터, 뒤집힌 내가 복귀하고있는 것입니다. 뒤집힌 문자열을 인쇄 할 때, 뒤집힌 문자열을 뒤집은 다음, 횡설수설 할 수없는 횡설수설을 보여줍니다. 그들은 어떤 이유로 든 같은 크기가 아닙니다. 여기

이 (제대로 작동) 나는 문자열의 길이를 찾기 위해 쓴 코드입니다

당신이 .... 문자열을 종료 NULL 필요
int length_of_string(char* stringptr) 
{ 
    int length=0,i=0; 
    while(*(stringptr+i)!='\0') 
    { 
     length++; 
     i++; 
    } 
    return length; 
} 
+0

팁 : length 함수의'i'와'length'는 동일하므로'i' 만 사용하십시오. –

+1

표준 strlen() 함수를 사용하는 대신 length_of_string을 작성한 특별한 이유가 있습니까? –

+0

@MarcB : 맞습니다. 나는 눈치 채지 못했습니다. 기여 해줘서 고마워. –

답변

1

NUL 종료 문자가 누락되었습니다. 한 개의 추가 문자flipped에 할당하고 끝에 '\0'을 명시 적으로 추가해야합니다.

char* return_flipped_string(char* stringptr) 
{ 
    int i=0,size_of_string=length_of_string(stringptr); 
    char *flipped; 
    flipped=(char *)malloc((size_of_string + 1)*sizeof(char)); 
    while(i<size_of_string) 
    { 
     *(flipped+i)=*(stringptr+size_of_string-1-i); 
     i++; 
    } 
    *(flipped+1) = '\0'; 
    return flipped; 
} 

BTW - 표준 라이브러리에서 strlen 기능을 알고 있습니까? length_of_string 함수가이를 복제합니다. strrev이 ANSI/ISO 표준에 있는지 기억이 나지 않습니다. 그들이 NUL 문자 ('\0')를 포함 할 때

+0

strlen을 사용해 보았지만 const char을 인수로 사용했습니다. 그리고 포인터로만 작업하고 싶습니다. 따라서 strlen을 잘못 사용했거나 여기에 맞지 않습니다. 나는 명확한 설명을 좋아할 것이다. –

+0

'strlen'에 대한 매개 변수는 "const char"에 대한 포인터이므로 strlen ("12345678") == 8'입니다. ' '을 포함하는 한'length_of_string'을'strlen'으로 대체 할 수 있습니다. –

3

while(i<size_of_string) 
    { 
     *(flipped+i)=*(stringptr+size_of_string-1-i); 
     i++; 
    } 
    flipped[size_of_string]=0; 
    return flipped; 
4

.. 그래서 같은 당신 플립 된 문자열의 끝에 null 바이트 ('\ 0')를 추가해야합니다. 반전 된 문자열 데이터 버퍼의 길이는 입력 문자열 의 길이와 null 문자열 종료 자 바이트에 대한 하나의입니다. 문자열이 끝나는 곳을 나타내는 null 바이트입니다.

0

C. C에서 문자열 같은 것은 문자열로 이 (관례)를 해석된다있는 문자 (char) 배열이있다 없습니다. 첫 번째 NUL은 문자열을 종료합니다. 배열에 NUL이 없으면 표준 문자열 함수 중 하나가 null 바이트가 발생할 때까지 사용자가 제공 한 주소에서 시작하여 버퍼를 계속 읽습니다.

따라서 횡설수설합니다.