我正在尝试在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
导致这些的原因是什么?
答案 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;
}
答案 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;
}