c语言字符串处理问题求教!

bywind1980 2005-04-14 09:27:57


一个由‘;’分隔符组成的串,如何把他们依次分开,并将各个子串的指针存储到一个字符指针数组中去,例如:
源串为1;2;3;4;5;
要求分割后存储到一个数组中s[0]="1";s[1]="2";s[2]="3"。
注意,开始并不知道源串中分隔符的个数,要求程序的效率尽可能高,不要采用先用一个循环求出分隔符的个数,然后再用一个循环来依次赋值的方法。

...全文
169 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
junmayang 2005-04-14
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "stdlib.h"

int main () {
char s[1000];
char **r = NULL;
char *p = NULL, *q = NULL;
char a = 0;
int i = 0, size1 = 0, size2 = 0;

while (1) {
printf("Input:\n");
gets(s);

if (!*s) {
return 0;
}

size1 = 0;
size2 = 0;
r = NULL;
p = s;
while (*p) {
a = *p;
p++;
if (a != ';') {
if (!r) {
size1 = 1;
size2 = 1;
r = (char **)malloc(sizeof(char *));
if (!r) {
printf("LUCK OF MEMORY\n");
return 0;
}
*r= (char *)malloc(sizeof(char));
if (!*r) {
printf("LUCK OF MEMORY\n");
return 0;
}
q = *r;
*q = 0;
}
q = realloc(q, (++size2) * sizeof(char));
*(r + size1 - 1) = q;
if (!q) {
printf("LUCK OF MEMORY\n");
return 0;
}
*(q + size2 - 2) = a;
*(q + size2 - 1) = 0;
//printf("q: %s\n", q);
}
else {
while (*p == ';') {
p++;
}
if (*p) {
r = realloc(r, (++size1) * sizeof(char *));
if (!r) {
printf("LUCK OF MEMORY\n");
return 0;
}
*(r + size1 - 1) = (char *)malloc(sizeof(char));
if (!*(r + size1 - 1)) {
printf("LUCK OF MEMORY\n");
return 0;
}
size2 = 1;
q = *(r + size1 - 1);
*q = 0;
}
}
}

printf("\nRESULT:\n");
for (i = 0; i < size1; i++) {
printf("%s\n", *(r + i));
if (*(r + i)) {
free(*(r + i));
*(r + i) = NULL;
}
}
if (r) {
free(r);
r = NULL;
}

printf("\n");
}
return 0;
}
pcboyxhy 2005-04-14
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
char str[]="1ab;2dg;3rgh;4gfh;5dgfsd;6jhkmn;7klj";
char save[20][10], *p=str;
int row=0, line=0, i;
while(1)
{
if(*p==';' || *p=='\0')
{
save[line++][row]='\0';
row=0;
}
else
save[line][row++]=*p;
if(!*p) break;
++p;
}
for(i=0; i<line; i++)
puts(save[i]);
system("PAUSE");
return 0;
}
Maxwell 2005-04-14
  • 打赏
  • 举报
回复
用strtok比较好,要尽量使用库函数。
SLSnake 2005-04-14
  • 打赏
  • 举报
回复
变量和指针类型定义上有些问题,自己再查查吧
SLSnake 2005-04-14
  • 打赏
  • 举报
回复
char *s[MAX];
char *p;
int i=1;
s[0] = strtok(buf, ";");
while(s[0])
{
s[i] = strtok(NULL, ";");
if(!s[i])
{
break;
}
else
{
p=strtok(NULL, "\0");
if(!p)
{
break;
}
i++;
}
}

bywind1980 2005-04-14
  • 打赏
  • 举报
回复
楼上的,我说明一下,原字符串有可能使很长的串,并且分隔符的个数是不知道的,我想达到的目的是让各个子串存储到一个指针数组中去。
SLSnake 2005-04-14
  • 打赏
  • 举报
回复
strcpy(buf,"1;2;3;4;5;");
s1 = strtok(buf, ";");
s2 = strtok(NULL, ";");
s3 = strtok(NULL, ";");
s4 = strtok(NULL, ";");
s5 = strtok(NULL, ";");
kobefly 2005-04-14
  • 打赏
  • 举报
回复
strtok

分割字符串,很好的一个函数
Flood1984 2005-04-14
  • 打赏
  • 举报
回复
这个本来就只用遍历一次是数组。

先定义一个字符指针数组 char *s[MAX];

然后从头开始读字符串,每遇到‘;’就把‘;’改成'\0'并把后面的一个字符的指针放到s中去。
至于s中有多少个数据有效,可以将s的无效数据处全放0
reeb 2005-04-14
  • 打赏
  • 举报
回复
考虑一下使用标准模板库里面的Vector吧,具体拆分的算法没有什么好写的,只是不要修改源字符串就可以了,谢谢
cdqy 2005-04-14
  • 打赏
  • 举报
回复
用链表吧
walkany 2005-04-14
  • 打赏
  • 举报
回复
/*其实地址是整数或者长整数,所以字符串的个数最多和字符个数相同,所以你可以申请如下*/

**********
表大错误,因为地址是整数,所以按照字符个数当作数组个数申请空间也非常的节省了,所以可以这样做阿
walkany 2005-04-14
  • 打赏
  • 举报
回复
char **strs;
char *tmpstr.tmpstr2;
char *buf=原始字符串;
int i;

int linelen;

/*其实地址是整数或者长整数,所以字符串的个数最多和字符个数相同,所以你可以申请如下*/
//这中做法的好处是所有的情况都可以出现,比如连续多个分号,分号结尾,非分号结尾等等
//连续分号输出一个空字符串。。。。
linelen=strlen(buf);
strs=(char *)malloc(sizeof(char *)*linelen+1);

i=0;
tmpstr2=buf;
while((tmpstr=strstr(tmpstr2,";"))!=NULL)
{
strs[i]=malloc(tmpstr-tmpstr2+1);
strncpy(strs[i++],tmpstr2,tmpstr-tmpstr2);
strs[i][tmpstr-tmpstr2]='\0';
tmpstr2=tmpstr+1;
}
strs[i]=malloc(strlen(tmpstr)+1);
strcpy(strs[i],tmpstr);
strs[i][strlen(tmpstr)]='\0';

strs[++i]=NULL; //标志
hanyaocsdn 2005-04-14
  • 打赏
  • 举报
回复
那你就进行动态数组分配啊
bywind1980 2005-04-14
  • 打赏
  • 举报
回复
看来大家还是没弄懂我的意思。我需要把各个子串存储到一个字符串数组中。这个问题的困难在于无法事先知道该数组的长度,下面是我的代码:
[CODE]
static void test(unsigned char * sou)
{
unsigned char * buf;
unsigned char* ucdes[50];

buf=strdup(sou);
ucdes[0]=strtok(buf,FGF);
while(ucdes[++i]=strtok(NULL,FGF));

return;
}
[/CODE]
这段代码的问题就在于unsigned char* ucdes[50] ,事先无法知道ucdes数组该分配多长,只能通过一次循环来确定分隔符的个数,进而确定数组的长度,然后第二次循环对数组赋值。
walkany 2005-04-14
  • 打赏
  • 举报
回复
最后增加几行:
strs[i]=malloc(strlen(tmpstr)+1);
strcpy(strs[i],tmpstr);
strs[i][strlen(tmpstr)]='\0';
walkany 2005-04-14
  • 打赏
  • 举报
回复
char **strs;
char *tmpstr.tmpstr2;
char *buf=原始字符串;
int i;

i=0;
tmpstr2=buf;
while((tmpstr=strstr(tmpstr2,";"))!=NULL)
{
strs[i]=malloc(tmpstr-tmpstr2+1);
strncpy(strs[i++],tmpstr2,tmpstr-tmpstr2);
strs[i][tmpstr-tmpstr2]='\0';
tmpstr2=tmpstr+1;
}
strcpy(strs[i],tmpstr);


刚才忘记了应该是指针数组,不是两位数组
walkany 2005-04-14
  • 打赏
  • 举报
回复
char *strs[MAXL];
char *tmpstr.tmpstr2;
char *buf=原始字符串;
int i;

i=0;
tmpstr2=buf;
while((tmpstr=strstr(tmpstr2,";"))!=NULL)
{
strncpy(strs[i++],tmpstr2,tmpstr-tmpstr2);
tmpstr2=tmpstr+1;
}
strcpy(strs[i],tmpstr);


怎样阿,是否短小阿?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧