2013-04-22 6 views
0

Я пытаюсь написать функцию в C, которая берет строку, например: "abc123def" и возвращает число в строковой форме: "123".Извлечение числа из строки

У меня мало опыта работы с C, поэтому мне было интересно, правильно ли я использую функцию isDigit(). Мой код ниже, если есть лучший способ решить проблему, я был бы признателен за помощь. Благодаря!

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; 
} 

Я получаю ошибки, такие как:

undefined reference to `isDigit' 

и

return makes integer from pointer without a cast 

Что может быть причиной этого?

+1

Это плохо сформулированный вопрос. Что, если строка - это что-то вроде «abc123def456ghi»? –

+1

Кажется, мне хорошо, но вы не выделили место для 'num1' в своем методе. Возможно, вам захочется прочитать информацию о распределении памяти C (попробуйте найти разницу между распределением статической и динамической памяти). * edit * Также похоже, что Kerrek SB прав ... требования немного не определены. Если мы можем предположить, что входная строка будет содержать только один номер, тогда вы должны быть в порядке – rliu

+0

Да, извините, в исходной строке есть только один номер. Я получаю такие ошибки, как «неопределенная ссылка на« isDigit »и« return делает целое число из указателя без литья ». –

ответ

3

Ваша функция должна возвращать char *, так как вы не просто возвращаете один символ, но кучу символов.

После быстрого поиска Google я обнаружил, что isdigit определяется в ctype.h, так строчные D и включают ctype.h.

Кроме того, у вас есть undefined behaviour, поскольку вы выделяете только num1 на длину строки 0. 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

Большое спасибо d in isdigit() стало причиной множества ошибок. Ваши решения работают, но я получаю предупреждение: предупреждение: несовместимое неявное объявление встроенной функции «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()' (от '', чтобы найти первую цифру, а затем скопировать ее и последующие цифры до первой, -значное. –

Смежные вопросы