//数组名是个静态地址值,不能被修改,如果想把数据存储到其中,可以用memcpy()函数进行内存拷贝,或采用循环进行赋值
结构内字符数组的赋值
#include <stdio.h>
#include <string.h>//非常重要,不然输不出
#include<iostream>
using namespace std;
struct{
char mark[12];
int num1;
double num2;
}t1,t2,t3;//t1,t2,t3是对象
int main()
{
string 创建的用法
//方法·1
string s,ss;
s.resize(100);//相当于给s开辟空间
cin>>ss;
for(int i=0;i<ss.length();i++)
s[i]=ss[i];
cout<<s<<endl;//空间开辟大了输出空格
//方法.2
string s,ss;
cin>>ss;
s="";//必须有,类似python,java的直接形成字符串
for(int i=0;i<ss.length();i++)
{
s+=ss[i];
}
cout<<ss<<endl;
// 更深入的来说:s这个string类型的对象并非单单只有字符串,其内还有许多用于操作的函数,于是&s并非字符串“中国”的首地址,而是s这个对象的首地址。
string s = "中国";
printf("%s" , s.c_str());
//string中c_str()成员方法返回当前字符串的首字符地址
cout<<s;//string中重载了“<<”操作符
char数组
void *memcpy(void *str1, const void *str2, size_t n)
例如: memcpy(d, s+11, 6);// 从第 11 个字符(r)开始复制,
连续复制 6 个字符(runoob)
char * strcpy(char * strDest,const char * strSrc);
t1.num1=1;
t1.num2=1.1;
//方法一:memcpy函数
const char src[50]="hello";
memcpy( t1.mark, src, strlen(src)+1);
//方法二:strcpy函数
strcpy( t1.mark,"hello" );
printf("t1=[%s %d %f]\n", t1.mark,t1.num1,t1.num2 );
memcpy( t2.mark, t1.mark, sizeof(t2.mark) ); //只对t2.mark数组赋值
printf("t2=[%s %d %f]\n", t2.mark,t2.num1,t2.num2 );
cout<<"\n\n";
t2.num1=2;
t2.num2=2.3;
printf("t1=[%s %d %f]\n", t1.mark,t1.num1,t1.num2 );
printf("t2=[%s %d %f]\n", t2.mark,t2.num1,t2.num2 );
cout<<"\n\n";
//其他可以直接赋值
t3.num1=t2.num1;
t3.num2=t1.num2;
printf(“t3=[%s %d %f]\n”, t3.mark,t3.num1,t3.num2 );
t2=t1 ; //结构体完整拷贝
printf("t1=[%s %d %f]\n", t1.mark,t1.num1,t1.num2 );
printf("t2=[%s %d %f]\n", t2.mark,t2.num1,t2.num2 );
}
一些区别:
#include<stdio.h>
#include<string.h>
//strcpy和memcpy覆盖区别
int main(void)
{
char src[] = "***";
char dest[] = "abcdefg";
printf("使用 memcpy 前: %s\n", dest);
memcpy(dest, src, strlen(src));
printf("使用 memcpy 后: %s\n", dest);
char src1[] = "+++";
strcpy(dest,src1);
printf("使用 strcpy 后: %s\n", dest);
return 0;
}