2015-01-15 1 views
0

내 문제는 숫자 문자열을 받아들이고 화면에 다른 숫자를 표시하는 것이 었습니다. 그래서 strtok()을 사용하여 문자열을 다른 숫자로 나눠보고 숫자로 변환하려면 atoi()을 사용하려고했습니다. 하지만 런타임 오류가 발생했습니다 .. 나는 또한 샘플 코드를 첨부했습니다.C에서 atoi()를 사용하는 런타임 오류

입력

1 22 123 89 12 as a string 

출력 나는이 숫자에 수학 연산을 할 필요가

1 22 123 89 12 as numbers 

. 그래서 정수에서 문자열로 변환해야합니다.

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

int main() 
{ 
    int i,j; 
    char buffer [256]; 

    char *token; 
    const char s[2]= " "; 
    fgets (buffer, 256, stdin); 

    token=strtok(buffer,s); 
    i = atoi (token); 
    printf("%d \n",i); 
    while (token!=NULL) 
       {token=strtok(buffer,s); 
       i = atoi (token); 
       printf("%d ",i); 
       } 

    return 0; 
} 
+0

'atoi'는'NULL' 포인터의 segfaults입니다. –

+0

'atoi'를 호출하기 전에'token! = NULL'을 확인하십시오. 현재 null을 확인하기 전에 atoi를 호출하고 있습니다. –

답변

1

당신은 자체 첫 atoi() 전에 NULL에 대한 token을 확인해야합니다. 이와 함께 보다 strtol()을 사용하는 것이 좋습니다.

while (token!=NULL) 
      {token=strtok(buffer,s); 

그렇지 않으면

while (token!=NULL) 
      {token=strtok(NULL,s); 

해야한다, 당신의 목적에 봉사하는 당신이 계속해서 또 다시 시작 입력을 구문 분석 끝날거야, 생각, 말했다.

다음으로, 루프에 strtok 호출에 인수를 바꾸는 것 외에

char * s = " \n"; 
2

처럼 fgets(), 사용 구분 문자열로 읽어, 당신은 당신이 strtokatoi를 호출하는 순서를 변경해야 \n 피하기 위해 . 지금 루프에서 strtokNULL을 반환하면 조만간 그렇게할까요?

strtok를 man page의()으로 당

token=strtok(buffer,s); 
while (token!=NULL) 
{ 
    i = atoi (token); 
    printf("%d ",i); 
    token = strtok(NULL, " "); 
} 
0

:

strtok를() 함수는 토큰 시퀀스로 문자열을 파싱한다. strtok()에 대한 첫 번째 호출에서 구문 분석 될 문자열은 strtok()에 지정되어야합니다. 이후의 각 호출에서 동일한 문자열을 구문 분석해야하는 경우 str은 NULL이어야합니다. 다음과 같이

char *strtok(char *str, const char *delim); 

그래서 당신의 while 루프를 수정 (atoi()strtok() 함수 호출의 순서 봐) :

while (token!=NULL) 
{ 
i = atoi (token); 
printf("%d ",i); 
token=strtok(NULL,s); 
} 

또한 분명히 atoi보다 더 strtol를 사용할 수 있습니다.