2012-11-19 2 views
-1

그래서 제목 당신은 삽입을 무시할 수C는 문자열 입력을 받고, 그리고 정수로의 일부를 변환

else if(input[0] == 'i'){ 
     printf("This works"); 
     if(isspace(input[1])){ 
      x = 2; 
      while(input[x] != '\0'){ 
       tempS[x - 2] = input[x]; 
      } 
      inp = atoi(tempS); 
      for(x = x-2; x >= 0; x--){ 
       tempS[x] == NULL; 
      } 
      insert(&linkedList, inp); 
      printf("%i %s %c", inp, " sucessfully inserted.", '\n'); 
     } 
    } 

이 코드를 말씀하고있어, 기본적으로 나는 사용자 입력을받을 수 있어야한다 나는 어떤 숫자. 예를 들어

: 내가 27

그런 다음 프로그램이 그 다른 경우 I에 있다고 인식하고 난 뒤의 숫자를해야합니다.

변수 초기화는 다음과 같습니다.

char *input; 
int inp = 0; 
int x = 0; 
char *tempS[255]; 

미리 감사드립니다.

편집 : 문제는 내가 심지어 printf 전에 세분화 오류가 발생합니다.

+0

const char *는 읽기 전용입니다. malloc 또는 calloc을 사용하여 메모리를 할당 해보십시오. –

+1

그래서'input'이 가리키는 부분을 어디에서 초기화 했습니까? –

+0

while 루프는 무한히 보입니다 ... 그리고 for 루프의'tempS [x] == NULL;은 아무것도하지 않습니다 ... –

답변

1

무한 루프가 진행 중입니다.

while(input[x] != '\0') 
    { 
      tempS[x - 2] = input[x]; 
    } 

명령어 추가 x ++; 따라서 배열 입력에서 다음 요소를 읽을 수 있습니다. 그렇지 않으면 x = 2 위치에 고정되어 있습니다.

char *input; 포인터 만 사용하면 메모리를 할당해야합니다. 사용중인 것처럼 사용할 수 있습니다. 다음을 수행하십시오 :

input = malloc(sizeof(char) * N); 

N은 입력 배열에 넣으려는 요소의 수입니다.

위에서 말했듯이 할당하지 않은 메모리에 액세스하려고하므로 segmentation fault이 표시됩니다.

1

입력 포인터에 malloc을 사용하여 메모리 (예약 메모리)를 할당해야합니다. (숯불 당신이 문자열로 inputed 때문에) '2'

// *---*---*---*---*------* 
// | i | | 2 | 1 | \'0' | 
// *---*---*---*---*------* 
//   ^----- You stay here. 

while(input[x] != '\0'){ 
    tempS[x - 2] = input[x]; 
} 

당신은 3 위치 숯불에 시작, 그래서 당신은 x = 2을 선언하고 :

char *input = malloc(sizeof(char) * 128); //If you needs 128 positions 

가보세요 : 뭔가 같은 는 널 종료 자 '\ 0'이 아니므로 while 루프는 내부 ​​명령문 tempS[x - 2] = input[x];을 영원히 실행합니다. 이 문제를 해결하려면 x 수정 종류를 추가해야합니다.

while(input[x] != '\0'){ 
    tempS[x - 2] = input[x]; 
    x++; 
} 
1

while 루프 관련 문제 : x가 증가하지 않으므로 종료되지 않습니다. 을 복사하지 않으므로 atoi이 다운 될 수 있습니다. input은 char 배열이지만 tempS은 char 포인터 배열입니다. input[2] 실제로 '\0'하고 루프가 종료 동안 당신이 그것을 대신 문자열의 말도 안되는 포인터 배열을 줄 때,이 경우는, 충돌하는 atoi 경우를 제외하고

나는 즉시, 충돌에 대한 이유를 볼 수 없습니다. 코드가 깨져서 표시되는 코드에 크래시가있을 수 있습니다 ...

경고를 설정 한 후 컴파일러 경고를 수정하십시오. 그 (것)들을 켜기 위하여, 당신은 컴파일러를위한 comppand 선 스위치를 필요로한다, gcc를 위해 다만 -W는 좋은 시작이다 ...실제 남성은 적어도 -W -Wall -pedantic -std=c11으로 컴파일되지만 (c11을 사용하려는 C 표준 버전으로 대체하십시오).