从字符串中提取数字

时间:2013-04-22 22:14:34

标签: c string

我正在尝试在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

导致这些的原因是什么?

2 个答案:

答案 0 :(得分: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

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