C程序求助:提取字符串中出现的数字字符
请问论坛各位大佬们,我在用C 写一个小程序提取字符串中出现的数字字符遇到一个问题:
代码在: https://paste.ubuntu.com/p/5kkJtxTV9C/
环境:win10, vs code 编写,gcc编译 。
遇到的问题是,运行程序得到指针数组第一个指针(保存的是一个字符)不能正常打印,其它可以。
str_ptrs = (char **)realloc(str_ptrs, 1 * sizeof(char *));
改成
str_ptrs = (char **)malloc(5 * sizeof(char *));
另外,除非你是在搞什么特殊工种内存是在紧张得要死,不要像怕浪费内存一样一个字节一个字节的都要realloc,你realloc一次就得重新拷贝一次,这损失的效率又怎么算呢?
一次malloc 512个字节不会有什么问题的 Croper 发表于 2019-7-19 20:45
改成
谢谢您的回复{:5_109:},我知道错哪了。 本帖最后由 ba21 于 2019-7-19 21:50 编辑
虽然有人回答了,不过你这代码太纠结,指针函数,指针,用得让人看起特别纠结。
根据题意,和你的代码,参考如下:
#include <stdio.h>
#include <stdlib.h>
#define NUM 20
char *ext_num2(char *str)
{
char *str_ptrs = NULL;
int i = 0;
int j = 0;
str_ptrs = (char *)malloc(NUM * sizeof(char));
if (str_ptrs == NULL)
{
printf("申请内存失败!\n");
exit(1);
}
while (str != '\0')
{
if (str >= '0' && str <= '9') // // 因为数字子字符串中的数字字符个数未知,故动态申请内存
{
str_ptrs = str; // 将数字字符 保存到 动态申请的内存空间内
if( j == (NUM - 1) )
{
printf("存储空间不足!,只能存储 %d 个字符\n", NUM);
break;
}
j++;
}
i++;
}
str_ptrs = '\0';
return str_ptrs;
}
int main()
{
char str;
char *ptr;
printf("请输入一个字符串: ");
gets(str);
ptr = ext_num2(str);
printf("\n输出字符\n");
printf("ptr -->%s \n", ptr);
free(ptr);
return 0;
}
ba21 发表于 2019-7-19 21:49
虽然有人回答了,不过你这代码太纠结,指针函数,指针,用得让人看起特别纠结。
根据题意,和你的代码,参 ...
谢谢您的回复,我初学C,代码写得不咋样,请见谅。不过,您的代码和我的意思不一样。
我的意思是,比如: “d1d22d333d4444d5”, 将1, 22,333,4444,5分别提出来,而不是存为一个字符串。
因为里面的数字字符串如“22”,“333”,长度是不确定的,所以用了动态申请内存的方法来存贮“数字字符串”,又因为我要保存这些”数字字符串“,但在“混合字符串”里面提取出来的“数字字符串”,数量不一样,又采取了动态指针数组的方法,每得到一个“数字字符串”就重新分配指针数组的内存,存储指针指向新的“数字字符串”。(我的错误就是使用realloc,忘记重新申请新内存空间了)
我这样一个一个字节的申请,我也不知道其中重新分配内存操作损失的效率和节省的内存相比,是否划算{:5_96:} dhts 发表于 2019-7-20 13:17
谢谢您的回复,我初学C,代码写得不咋样,请见谅。不过,您的代码和我的意思不一样。
我的意思是,比如: ...
以现在的知识,实现你的提取出来的数字每组存入 一个数组(这个数组动态malloc固定长度),然后再主函数声明个指针数组,用来存malloc出来的地址。我认为这样会好点; 编程不是死的,至于用什么办法好,看实际情况。
ba21 发表于 2019-7-20 20:25
以现在的知识,实现你的提取出来的数字每组存入 一个数组(这个数组动态malloc固定长度),然后再主函数 ...
嗯嗯{:5_106:} dhts 发表于 2019-7-20 21:15
嗯嗯
刚刚按我说的写了个,都没有用到指针函数,参考下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 20
void ext_num2(char *str, char *str_num[])
{
int i = -1;
int j = -1, k= 0;
while (str[++i] != '\0')
{
if (str >= '0' && str <= '9') // // 因为数字子字符串中的数字字符个数未知,故动态申请内存
{
if (k==0)
{
str_num[++j] = (char *)malloc(NUM * sizeof(char));
memset(str_num, '\0', NUM * sizeof(char));
if (str_num == NULL)
{
printf("申请内存失败!\n");
exit(1);
}
}
str_num = str;
k++;
continue;
}
else
{
k=0; // 标记数字开始,也用于数组累加
}
}
}
int main()
{
char str;
char *str_num={NULL};
int i;
printf("请输入一个字符串: ");
gets(str);
ext_num2(str, str_num);
printf("\n输出字符\n");
i = 0;
while(str_num!=NULL)
{
printf("ptr[%d] -->%s \n", i, str_num);
free(str_num);
i++;
}
return 0;
}
ba21 发表于 2019-7-20 21:49
刚刚按我说的写了个,都没有用到指针函数,参考下
好的,收到。谢谢大佬热心回复。{:7_113:}
页:
[1]