高分求救,字符串赋值给结构体

wxdcxp 2010-06-02 11:47:08

#include <stdio.h>
#include <string.h>

typedef struct _test
{
char a[3];
char b[3];
char c[3];

}test;
//去除右边空格
int trim_right(char *str, int len)
{
while (len > 0) {
if (str[len-1] != 0x20)
break;
--len;
}
str[len] = '\0';
return len;
}

int main(void)
{
char c[20] = "12 3456 ";
char d[20] = {0};
test t = {0};

memcpy(&t,c,20);
trim_right(t.a, sizeof(t.a));
trim_right(t.b,sizeof(t.b));


sprintf((char *)d, "a: %s\r\n", t.a);
sprintf((char *)d, "%sb: %s\r\n", d, t.b);
sprintf((char *)d, "%sc: %s\r\n",d, t.c);
puts(d);

return 0;


}



比如我有一个字符串12 3456 ,如何把这个字符串赋值给结构体,使得输出的结果是
a:12
b:345
c:6

目前只能输出
a: 12
b:345
c:
因为数组b的大小是3,所以只能把空格存放到数组c里导致数组c不能输出内容。想了很多方法都无法实现,请高手帮忙解答

...全文
424 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
d741963250 2010-06-03
  • 打赏
  • 举报
回复
str[len] = '\0';
return len;
你这里 trim_right(t.b,sizeof(t.b));//其实传的是(t.b,3);
由于对于t.b来说str[3]其实是不存在的,因为就3个元素,由于这个结构体内的成员都是顺序存放的(这个结构体不存在内存对齐的问题),他就强行把t.c[0]这个字符改为'\0',因此你输出c的时候也就是空白了,等于什么东西都没有。。


sfd1234 2010-06-03
  • 打赏
  • 举报
回复
不要往复杂整,不能代表你水平高!
happytang 2010-06-03
  • 打赏
  • 举报
回复
楼主的思路还可以,只不过忘了边界
if(len!=3)
str[len] = '\0';

我这么一修改是不是清晰了很多;不过你的代码扩展性不强
happytang 2010-06-03
  • 打赏
  • 举报
回复
在楼主代码上还原
#include <stdio.h>
#include <string.h>

typedef struct _test
{
char a[3];
char b[3];
char c[3];

}test;
//去除右边空格
int trim_right(char *str, int len)
{
while (len > 0) {
if (str[len-1] != 0x20)
break;
--len;
}
if(len!=3)
str[len] = '\0';
return len;
}

int main(void)
{
char c[20] = "12 3456 ";
//char d[20] = {0};
test t = {0};

memcpy(&t,c,sizeof(test));
trim_right(t.a, sizeof(t.a));
trim_right(t.b,sizeof(t.b));
trim_right(t.c,sizeof(t.c));

printf( "a: %s\r\n", t.a);
printf( "b: %s\r\n", t.b);
printf( "c: %s\r\n", t.c);
//puts(d);

return 0;


}
wxdcxp 2010-06-03
  • 打赏
  • 举报
回复
刚才没注意,可以给结构体在加个成员
char Temp[20];
konta 2010-06-03
  • 打赏
  • 举报
回复
你那函数明显不行的,兄弟。你再看看吧

sizeof(t.a)是等于3没问题,看清楚那函数,传过去的是个数据首地址的指针,所以能对第四位的6操作。
旭辉林荫 2010-06-03
  • 打赏
  • 举报
回复
再说,你sizeof一个3456怎么能得出个3来。
旭辉林荫 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 konta 的回复:]

不是吧。。。
传递过去的是一个指针,也即数据"3456 "的起始地址,所以在相继的操作过程中,len==3,
相应的,数据6被修改为\0
[/Quote]
问题是这个指针指向的数组只有3个元素。你看看声明嘛
typedef struct _test
{
char a[3];
char b[3];
char c[3];

}test;
konta 2010-06-03
  • 打赏
  • 举报
回复
不是吧。。。
传递过去的是一个指针,也即数据"3456 "的起始地址,所以在相继的操作过程中,len==3,
相应的,数据6被修改为\0
旭辉林荫 2010-06-03
  • 打赏
  • 举报
回复
int trim_right(char *str, int len)
{
while (len > 0) {
if (str[len-1] != 0x20)

str[len-1] = '\0';
break;

--len;
}
return len;
}
我先改了下这个函数,这样的话从又向左去掉第一个空格。
旭辉林荫 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 konta 的回复:]

C/C++ code

int trim_right(char *str, int len)
{
while (len > 0) {
if (str[len-1] != 0x20)
break;
--len;
}
str[len] = '\0';
return len;
}


这段代码有问题,当运行tr……
[/Quote]
我先指出你几个错误的地方,trim_right(t.b,sizeof(t.b))中str放的是345,不是3456,还有这段代码不是将6换成\0,而是将3换成\0。这个函数本身是个不太好的函数,你去掉右边的空格没问题,但是没有空格的时候就问题大了。
andylyop12 2010-06-03
  • 打赏
  • 举报
回复
上面selooloo的也可以,不过忘了加换行哈。帮着加上了:

#include <stdio.h>
#include <string.h>

typedef struct _test
{
char a[3];
char b[3];
char c[3];

}test;
//去除右边空格
int trim_right(char *str, int len)
{
while (len > 0) {
if (str[len-1] != 0x20)
break;
--len;
}
str[len-1] = '\0';
return len;
}

int main(void)
{
char c[20] = "12 3456 ";
char d[20] = {0};
test t = {0};
int i;
memcpy(&t,c,sizeof(test));
printf("a: ");
for(i=0;i!=3;++i)
putchar(t.a[i]);
putchar('\n');
printf("b: ");
for(i=0;i!=3;++i)
putchar(t.b[i]);
putchar('\n');
printf("c: ");
for(i=0;i!=3;++i)
putchar(t.c[i]);
putchar('\n');
return 0;
}
andylyop12 2010-06-03
  • 打赏
  • 举报
回复
虽然可以实现楼主的功能,但感觉代码比较乱哈
andylyop12 2010-06-03
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<string.h>


typedef struct _test
{
char a[3];
char b[3];
char c[3];

}test;
//去除右边空格
int trim_right(char *str, int len)
{
while (len > 0) {
if (str[len-1] != 0x20)
break;
--len;
}
str[len] = '\0';
return len;
}

int main(void)
{
char c[20] = "12 3456 ";
char d[20] = {0};
int i;
char * y;

test t = {0};

memcpy(&t,c,9);
y = t.c;
for(i = 2;i >= 0;i--)
*(y + i) = *(y + i -1);
*(y+3) = '\0';



trim_right(t.a, sizeof(t.a));
trim_right(t.b,sizeof(t.b));
sprintf((char *)d, "a: %s\r\n", t.a);
sprintf((char *)d, "%sb: %s\r\n", d, t.b);

for(i = 0;i <3;i++)
*(y+i) = *(y+i+1);


sprintf((char *)d, "%sc: %s\r\n",d, t.c);
puts(d);

return 0;


}
东莞某某某 2010-06-03
  • 打赏
  • 举报
回复
改了下 不知道行不行:

#include <stdio.h>
#include <string.h>

typedef struct _test
{
char a[3];
char b[3];
char c[3];

}test;
//遍历字符串,去掉空格,并存放入结构中
void trim_right_cpy(char * str,test *pt)
{
char *p;
int i,j;
for(i=0;i<=6;i+=3)
{
p=(char *)pt+i;
for(j=0;j<3;j++)
{
if( str[i+j]!=' ' && str[i+j] )
{
*(p++)=str[i+j];
}
}
}
}



int main(void)
{
char c[20] = " 345 3 4535 ";
char d[20] = {0};
test t = {0};

trim_right_cpy(c, &t);


sprintf(d, "a:%c%c%c", t.a[0],t.a[1],t.a[2]);
sprintf(d, "%s\nb:%c%c%c", d, t.b[0],t.b[1],t.b[2]);
sprintf(d, "%s\nc:%c%c%c", d, t.c[0],t.c[1],t.c[2]);
puts(d);

return 0;

}

konta 2010-06-03
  • 打赏
  • 举报
回复

int trim_right(char *str, int len)
{
while (len > 0) {
if (str[len-1] != 0x20)
break;
--len;
}
str[len] = '\0';
return len;
}

这段代码有问题,当运行trim_right(t.b,sizeof(t.b))时,str[len] = '\0'会将数据"3456 "中的字符'6'替换掉。
selooloo 2010-06-03
  • 打赏
  • 举报
回复
LZ这个代码真杯具,想输出结果老老实实的用个for循环不就可以了

#include <stdio.h>
#include <string.h>

typedef struct _test
{
char a[3];
char b[3];
char c[3];

}test;
//去除右边空格
int trim_right(char *str, int len)
{
while (len > 0) {
if (str[len-1] != 0x20)
break;
--len;
}
str[len-1] = '\0';
return len;
}

int main(void)
{
char c[20] = "12 3456 ";
char d[20] = {0};
test t = {0};
int i;
memcpy(&t,c,sizeof(test));
for(i=0;i!=3;++i)
putchar(t.a[i]);
for(i=0;i!=3;++i)
putchar(t.b[i]);
for(i=0;i!=3;++i)
putchar(t.c[i]);
return 0;
}

你的程序有好几处都越界了,
memcpy(&t,c,20);这里就越界了,t只能接受9个字符容量,你复制了20
memcpy(&t,c,sizeof(test));

trim_right会修改你的结构体成员,所以后面的打印结果不对,真要修改也不要越界修改,
str[len-1]= '\0';

sprintf((char *)d, "%sb: %s\n", d, t.b);用自己修改自己, 这个不是自己挖自己墙角么,会容易导致程序崩溃
wxdcxp 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cattycat 的回复:]
用strncpy给t.a,t.b,t.c每个成员复制2个字符,并把结尾写成\0
[/Quote]

把每个成员复制两个字符,问题是有的成员不报告结尾就有三个字符
cattycat 2010-06-03
  • 打赏
  • 举报
回复
用strncpy给t.a,t.b,t.c每个成员复制2个字符,并把结尾写成\0
wxdcxp 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 d741963250 的回复:]
str[len] = '\0';
return len;
你这里 trim_right(t.b,sizeof(t.b));//其实传的是(t.b,3);
由于对于t.b来说str[3]其实是不存在的,因为就3个元素,由于这个结构体内的成员都是顺序存放的(这个结构体不存在内存对齐的问题),他就强行把t.c[0]这个字符改为'\0',因此你输出c的时候也就是空白了,等于什么东西都没有。。
……
[/Quote]

我也知道他强行把t.c[0]这个字符改为'\0'问题是别人定义结构体内数组成元大小不能改变
如何才能正常输出
加载更多回复(5)

69,336

社区成员

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

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