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

这些可能是什么原因造成的?

4

2 回答 2

3

您的函数需要返回char *,因为您不仅返回单个字符,而且返回一堆字符。

在快速谷歌搜索后,我发现它isdigit是在 中定义的ctype.h,所以小写D并包含ctype.h

此外,您在那里有一些未定义的行为,因为您只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;
}

测试

于 2013-04-22T22:46:12.517 回答
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;
}
于 2013-04-22T22:58:26.637 回答