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

wxdcxp 2010-06-02 11:47:46

#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不能输出内容。想了很多方法都无法实现,请高手帮忙解答

...全文
204 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
东莞某某某 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;

}

amekin 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 nbda1121440 的回复:]

楼主,我想请教一下memcpy是干什么的
我是新手,不懂
[/Quote]

这个 是内存copy,
第一个参数是 目标地址 你要copy到哪里去
第二个参数是 源地址 你的数据哪里来
第三个参数是 copy长度 你要copy的长度
bobo364 2010-06-03
  • 打赏
  • 举报
回复
也就是从一个字符串中(不是字符数组),中复制设定大小的字符到另一个字符串(从头开始复制),所谓的重叠指新的串有字符
bobo364 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 nbda1121440 的回复:]
楼主,我想请教一下memcpy是干什么的
我是新手,不懂
[/Quote]

memcpy
语法:




#include <string.h>
void *memcpy( void *to, const void *from, size_t count );


功能:函数从from中复制count 个字符到to中,并返回to指针。 如果to 和 from 重叠,则函数行为不确定。
bobo364 2010-06-03
  • 打赏
  • 举报
回复
明白了2楼的代码,原来那个去空格,是只要右边没空格,直接退出循环,有的话长度减一
#include<stdio.h>

typedef struct _test
{
char a[3+1];
char b[3+1];
char c[3+1]; //字符串操作,需要+1的空间保存\0字符
}test;


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


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

//memcpy(&t,c,20);
strncpy(t.a,c,sizeof(t.a)-1); //strncpy指定字节数即可
strncpy(t.b,c+sizeof(t.a)-1,sizeof(t.b)-1); //注意计算copy的位置
strncpy(t.c,c+sizeof(t.a)+sizeof(t.b)-2,sizeof(t.c)-1);
trim_right(t.a, strlen(t.a));
trim_right(t.b,strlen(t.b));
trim_right(t.c,strlen(t.c));//用字符串操作函数


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);
system("pause");
return 0;
}
goodluckme2013 2010-06-03
  • 打赏
  • 举报
回复
//打印
printf("%c",t.c[0]);
周靖峰 2010-06-03
  • 打赏
  • 举报
回复
楼主,我想请教一下memcpy是干什么的
我是新手,不懂
pengzhixi 2010-06-03
  • 打赏
  • 举报
回复
用strncpy吧,这样你可以控制复制过去的字符数。
wxdcxp 2010-06-03
  • 打赏
  • 举报
回复
问题是别人定协议时没有把空格考虑在内,协议是跟其他平台定的不能改
比如日期201005他定义的长度char data[6],这样导致日期后面的数据无法输出。现在我在想有什么办法
空间定义没有包括结束符时任然能够正常输出
Mg 2010-06-03
  • 打赏
  • 举报
回复
顶上面的,拷贝的时候需要控制字节数,而且需要给'\0'预留空间~
cattycat 2010-06-03
  • 打赏
  • 举报
回复
对char数组最后应该有一个\0表示结束。用strncpy复制的时候控制字节数。
jixingzhong 2010-06-03
  • 打赏
  • 举报
回复
由于输出时%s,所以,必须有\0以保证操作正常


typedef struct _test
{
char a[3+1];
char b[3+1];
char c[3+1]; //字符串操作,需要+1的空间保存\0字符

}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(int argc, char* argv[])
{
char c[20] = "12 3456 ";
char d[20] = {0};
test t = {0};

//memcpy(&t,c,20);
strncpy(t.a,c,sizeof(t.a)-1); //strncpy指定字节数即可
strncpy(t.b,c+sizeof(t.a)-1,sizeof(t.b)-1); //注意计算copy的位置
strncpy(t.c,c+sizeof(t.a)+sizeof(t.b)-2,sizeof(t.c)-1);
trim_right(t.a, strlen(t.a));
trim_right(t.b,strlen(t.b));
trim_right(t.c,strlen(t.c));//用字符串操作函数


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;
}
qm65325790 2010-06-03
  • 打赏
  • 举报
回复
liutengfeigo 2010-06-03
  • 打赏
  • 举报
回复

怎么又发贴?
代码转载自:https://pan.quark.cn/s/11d565366452 【USB转I2C/IIC适配器上位机应用程序】是一种针对I2C(Inter-Integrated Circuit)通信协议而构建的工具,其通过USB端口将个人计算机转变为能够与I2C设备进行交互的控制器。该适配器使开发人员与工程师能够便捷地对遵循I2C协议的芯片执行读取和写入任务,因此在硬件构建和测试阶段能够显著提升效率,对于核实I2C接口芯片的工作性能具有特别的价值。 I2C协议是由飞利浦(现NXP半导体)于1980年代初创立的一种双线式串行总线,其目的是用于连接微控制器及其他外围设备。该协议仅需两条信号线(SDA - 数据线,SCL - 时钟线)即可完成多设备间的通信,大幅度削减了电路板上的布线需求,从而降低了生产成本。I2C协议提供多种速度等级,涵盖标准模式(100kbps)、快速模式(400kbps)以及高速模式(3.4Mbps),旨在满足不同场景下的应用要求。 Ginkgo USB转I2C适配器是这项技术的具体应用实例,它提供了一个物理接口,用于将USB端口转换为I2C端口。适配器内部装配有一个微控制器单元,该单元负责处理从USB到I2C的信号转换,并且通过USB线路向计算机传输信息,同时接收来自计算机的指令以操控I2C总线。这种设计使用户无需具备深厚的硬件知识,仅需借助上位机软件即可实现对I2C设备的操控。 Ginkgo I2C Adapter Classic是与该适配器相配套的软件,通常包含以下几项核心功能: 1. 设备识别:自动检测并建立与USB转I2C适配器的连接。 2. 总线探查:扫描I2C总线上所连接的设备地址,有助于准确定位设备的位置。 3. 读写指令...
代码转载自:https://pan.quark.cn/s/4c053f9292d9 在Android应用程序的设计与实现过程中,有时需要借助C或C++语言所具备的高性能特点,此时就必须借助Android Studio的NDK(Native Development Kit)工具来对C/C++代码进行编译,进而生成SO(Shared Object)动态链接库文件。本篇文章将详尽阐述在Android Studio环境下如何执行这一流程。 我们首先需要掌握Android Studio项目的基本组织架构。在Android Studio的`app`文件夹内,存在一个名为`src`的子文件夹,该文件夹通常包含了`main`以及其他相关源代码目录。在`main`文件夹中,除了我们常见的`java`文件夹外,还设立了一个`jniLibs`文件夹,此文件夹专门用于存储SO文件。除此之外,还有一个`jni`文件夹,它是用来存放C/C++源代码的地方。 为了实现C/C++代码的编写与编译,我们必须在`build.gradle`文件中配置NDK的支持。打开`app/build.gradle`文件,在`defaultConfig`部分中嵌入以下内容: ```groovy externalNativeBuild { ndkBuild { path src/main/jni/Android.mk } } ``` 这段内容明确指示Android Studio去何处寻找`Android.mk`文件,该文件是一种Makefile的变体,主要用于设定编译规则和编译目标。 接下来,我们需要创建`Android.mk`文件。在这个文件中,我们将明确指定源代码文件、编译选项以及要生成的库名称。一个基础的...
内容概要:本文围绕麦克斯韦旋度方程的差分形式在平面极化磁场中的应用展开深入研究,并通过Matlab代码实现相关数值仿真。研究的核心是将经典的麦克斯韦方程组转化为适用于数值计算的有限差分格式,构建离散化数学模型,进而模拟和分析平面极化条件下磁场的空间分布特征与时间演化规律。文中系统阐述了差分方法的理论基础与数学推导过程,详细说明网格划分、边界条件设定及迭代求解策略,最终利用Matlab编程实现电磁场的可视化仿真,有效验证了差分方法在求解复杂电磁场问题中的准确性与可行性。该研究不仅加深了对电磁波传播机理的理解,也为电磁器件的设计优化与工程仿真提供了可靠的数值分析手段。; 适合人群:具备电磁场与电磁波理论基础,熟悉偏微分方程数值解法,且掌握Matlab编程技能的电气工程、物理学、应用数学等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入掌握麦克斯韦旋度方程的有限差分法基本原理及其在二维平面磁场仿真中的具体实施步骤;②学习如何利用Matlab进行电磁场问题的建模、编程求解与结果可视化;③为后续开展更复杂的电磁兼容、天线设计或光子晶体等领域的数值模拟研究奠定坚实的技术基础。; 阅读建议:建议读者结合经典电磁场理论教材,透彻理解麦克斯韦方程组的物理内涵,然后循序渐进地跟进文中的差分格式推导过程,务必动手复现并调试所提供的Matlab代码,通过调整参数观察仿真结果的变化,从而深刻领悟数值方法的实质与应用技巧。

70,039

社区成员

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

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