2014-06-21 1 views
1
#include<cstdio> 
#include<cstring> 
#include<cstdlib> 

int main(){ 
    int t; 
    scanf("%d",&t); 
    while(t--){ 
     char *str; 
     scanf("%s",str); 
     int l,n,nop=1; 
     l=strlen(str); 
     printf("Length %d",l); //causing segmentation fault 
     if(l%2==0)n=l/2; 
     else n=(l-1)/2; 
     for(int i=0;i<n;i++)nop=nop+abs(str[i]-str[l-1-i]); 
     printf("%d\n",nop); 
    } 
    return 0; 
} 

문자열의 길이를 인쇄 할 때 오류가 발생합니다. 그 행을 지우면 코드가 제대로 작동하지만 잘못된 결과가 나옵니다.C++에서 strlen의 인쇄 출력을 사용하는 동안 세그먼트 오류가 발생했습니다. 4.8.1

char *str = (char *)malloc(SIZE); 

그렇지 않으면 정의되지 않은 동작를 호출합니다 : 코드는 당신이 그것을 위해 공간을 할당하여 str를 초기화해야

+1

'의 char * str을에서 %zu%d을 변경; scanf ("% s", str); 포인터는 자동으로 무기한 크기의 문자열을 저장할 수있는 메모리를 가리 키지 않습니다. – chris

+0

'str'은 어디에서 초기화합니까? –

+0

@chris는 당신이 str 앞에 짧다는 것을 말하려는 것이고 이것은 메모리 corruptiom으로 연결됩니다. – bmargulies

답변

1

++ DevC와 잘 작동합니다. 또한, strlen 반환 유형이 size_t 때문에 size_t 유형 l를 선언하고 printf

+0

다음 오류가 발생합니다 : 잘못된 변환 'void *'에서 'char *'[-fpermissive] –

+0

'malloc'의 반환 값을'char *'에 던지십시오. – haccks

+0

네, 이제 작동합니다. 하지만 DevC++에서 올바른 코드로 작업 한 코드가 왜 발생 했습니까? –