2013-04-22 12 views
0

예를 들어 "abc123def"과 같이 문자열을 사용하는 함수를 C에 작성하려고 시도하고 문자열 형식의 숫자 인 "123"을 반환합니다.문자열에서 숫자 추출

저는 C 언어에 대한 경험이 거의 없으므로 isDigit() 기능을 제대로 사용하고 있는지 궁금합니다. 내 코드가 아래 있습니다. 문제를 해결할 수있는 더 좋은 방법이 있다면 도움을 주시면 감사하겠습니다. 감사! 이러한 원인이 될 수 무엇

undefined reference to `isDigit' 

return makes integer from pointer without a cast 

:

char findNumber(char *str1) 
{ 
    char num1[] = ""; 
    int i = 0; 
    int j = 0; 
    while(str1[i] != '\0') { 
      if(isDigit(str1[i])) { 
        num1[j] = str1[i]; 
        j++; 
      } 
      i++; 
    } 
    num1[j] = '\0'; 
    return num1; 
} 

int main(int argc, const char* argv[]) 
{ 
    char str2[] = "!3254"; 
    printf(findNumber(str2)); 
    return 0; 
} 

나는 다음과 같은 오류를 받고 있어요?

+1

. 만약 문자열이''abc123def456ghi ''와 같은 것이라면? –

+1

나에게 잘 들리지만, 메소드에'num1'을위한 공간을 할당하지 않았습니다. C 메모리 할당 (정적 메모리 할당과 동적 메모리 할당의 차이점을 찾아보십시오)을 읽어 볼 수 있습니다. * 편집 * 또한 Kerrek SB가 맞는 것처럼 보입니다. 요구 사항은 제대로 정의되지 않았습니다. 입력 문자열에 하나의 숫자 만 포함된다고 가정하면 괜찮을 것입니다. – rliu

+0

죄송합니다. 원래 문자열에는 하나의 숫자 만 있습니다. "isDigit '에 대한 정의되지 않은 참조"와 "캐스트없이 포인터에서 정수로 돌아 가기"와 같은 오류가 발생합니다. –

답변

3

단일 문자 만 반환하는 것이 아니기 때문에 함수는 char *을 반환해야합니다.

빠른 Google 검색 후 isdigitctype.h에 정의되어 있으므로 소문자 D에 정의되어 있으며 ctype.h이 포함되어 있습니다.

또한 길이가 0 인 문자열의 경우에만 num1에 메모리를 할당하기 때문에 일부는 undefined behaviour입니다. char *num1 = malloc(someSize)은 하나의 옵션으로 프로그램이 몇 초/분 이상 실행될 경우에는 free 어딘가에 있어야합니다. 수정 후

코드 :

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

#define MAX_SIZE 100 

char *findNumber(char *str1) 
{ 
    char *num1 = malloc(MAX_SIZE); 
    // using "strlen(str1)+1" instead of MAX_SIZE might be preferred 
    int i = 0, j = 0; 
    while(str1[i] != '\0') { 
      if(isdigit(str1[i])) { 
        num1[j] = str1[i]; 
        j++; 
      } 
      i++; 
    } 
    num1[j] = '\0'; 
    return num1; 
} 

int main(int argc, const char* argv[]) 
{ 
    char str2[] = "!3254"; 
    printf(findNumber(str2)); 
    return 0; 
} 

Test.

+0

isdigit에서 많은 d 개가 감사합니다. 오류가 많이 발생했습니다. 귀하의 솔루션이 작동하지만 경고 메시지가 나타납니다 : 경고 : 내장 함수 'malloc'의 암시 적 선언이 호환되지 않습니다 걱정할 필요가 있습니까? –

+0

문자열 "abc123def456"'이 주어지면이 코드는''123456 ''을 반환합니다. 그것이 의도라면, 위대합니다. 그렇지 않다면 알고리즘은 아마도'strpbrk()'또는'strcspn()'(''에서 첫 번째 자릿수를 찾은 다음 그 자릿수와 그 다음 자릿수를 첫 번째 자릿수까지 복사 할 필요가 있습니다.) –

+0

Perfect, 덕분에 Dukeling과 Jonathan Leffler @ JonathanLeffler 문자열에 최대 1 자의 숫자가 있으므로 위의 예제 입력은 절대 없을 것입니다. –

2

이 작동합니다 : 잘못 내용의 질문이 있어요

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

char* findNumber(char *str1) 
{ 
    char* num1=malloc(strlen(str1)+1);//allocate memory for the number 
    int i = 0; 
    int j = 0; 
    while(str1[i] != '\0') { 
      if(isdigit(str1[i])) {//isdigit() is in ctype.h 
        num1[j] = str1[i]; 
        j++; 
      } 
      i++; 
    } 
    num1[j] = '\0'; 
    return num1; 
} 

int main(int argc, const char* argv[]) 
{ 
    char str2[] = "!3254"; 
    char* number=findNumber(str2); 
    printf("%s\n",number); 
    free(number);//free the allocated memory 
    return 0; 
} 
+0

문자열 "abc123def456"'이 주어지면이 코드는''123456 "'을 반환합니다. 그 의도는 큽니다. 그렇지 않다면 알고리즘은 아마도'strpbrk()'또는'strcspn()'('')을 사용하여 첫 번째 숫자를 찾은 다음 첫 번째 숫자를 찾아서 그 다음 숫자를 첫 번째 비어 있지 않은 숫자 -손가락. –

관련 문제