推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

「C与指针心得」1.scanf\strncpy\strcpy\memcpy的使用

   2023-06-30 网络整理佚名1610
核心提示:调用形式:scanf(“”,);//是一个数组,scanf使用时,可以直接输入该函数的参数是字符指针,也就是可以是字符串变量和字符数组,因为它们的变量名代表首字符地址。字符串默认有一个null结束符,字符数组没有。当2)中n=dest串长度时,定义dest为字符数组,因为这时没有null字符拷贝。函数从s2指向的对象中复制n个字符到s1指向的对象中。

感谢您的关注和喜欢!

本文默认读者已经有一点C语言基础,循环操作、分支语句、变量定义等简单操作不再赘述。

本章重点介绍如何从键盘输入并复制相应的字符串。 这里主要用到了C的四个基本API——scanf\\\。

扫描

功能:是格式输入函数,即按照用户指定的格式从键盘输入数据到指定的变量中

头文件:#

调用形式:scanf("",);

注意:第二个参数是地址,记得加&来获取地址符号,如果是数组则不需要加&符号,如果是下表的数组则需要加& 获取地址符号

整数[8];

整数;

scanf("%d", #);

scanf(“%d”,); //是一个数组,使用scanf时可以直接输入

scanf(“%d”,&[1]); //这里只想使用第一个字段,所以需要带入下标

例如:

scanf("%d %d",&a,&b);

如果a和b都读取成功,则scanf的返回值为2

如果只有a读取成功,则返回值为1

如果a和b都没有成功读取,则返回值为0

如果遇到错误或遇到文件结尾,则返回值为 EOF。

并且返回值是int类型。

&a、&b、&c中的&是地址运算符,&a指的是a在内存中的地址。 scanf的作用是根据a、b、c的内存地址将输入的数据存储到a、b、c中。 变量a、b、c的地址在编译的连续阶段中分配(存储顺序由编译器决定)。

注意部分:

如果scanf中的%d连续写入如“%d%d%d”,则输入数据时,数据之间不允许有逗号,只能有空格或制表键或回车键——“2 3 4”或“2(按选项卡)3(按选项卡)4(按选项卡)”。 如果是“%d,%d,%d”,则输入数据时需要加“,”,如“2,3,4”。

相关输入格式

变量类型

%d 个整数

%ld 长

%f 浮动

%如果

%c 字符

%s 字符数组

代码示例:

#include 
#include 
int main(void)
{
 int a;
 float b;
 char c;
 scanf("%d,%f,%c",&a,&b,&c);
 printf("a=%d,b=%f,c=%c\n",a,b,c);
 scanf("%d%f %c",&a,&b,&c);
 printf("a1=%d,b1=%f,c1=%c\n",a,b,c);
 return 0;
}

输入输出:

1,2.3,d //输入
a=1,b=2.300000,c=d //输出
1 2.4 e //输入
a1=1,b1=2.400000,c1=e //输出

功能:将从src地址开始且包含NULL终止符的字符串赋值给从dest开始的地址空间,并返回dest(复制地址中存储的新值)

头文件:# 和

调用形式:char(char dest,char *src);

注意:src和dest指向的内存区域不能重叠,dest必须有足够的空间容纳src的字符串。

函数原型:

char* strcpy(char* des,const char* source) 
{
 char* r=des; 
 assert((des != NULL) && (source != NULL));
 while((*r++ = *source++)!='\0');
 return des;
}

注意:

该函数的参数是一个字符指针,即可以是字符串变量,也可以是字符数组,因为它们的变量名代表的是第一个字符的地址。 默认情况下,字符串具有空终止符,而字符数组则没有。 所以这里需要注意:因为src需要空终止符,所以字符数组的长度必须大于等于src包含空终止符的总长度。

例如,char* src=“abcd”; 字符目标[5]; 其中 dest 的长度至少为 5。

示例代码:

int main()
{
 char dest[30] = {0};
 char src[20]={"Hello world!"};
 strcpy(dest, src);
 printf("%s\n", src);
 return 0;
}

输出:

Hello world!

思考:如果这里dest的长度是2,会不会有问题。

答:如果只是在PC上运行代码,可能不会出现错误,但是如果放到真实的程序中运行,就会出现地址异常错误。 因为dest的栈空间只有两个字节,但是“Hello World!” 需要复制的内容远远超过两个字节,剩余的内容将被复制到dest堆栈空间的连续地址中。 如果这些地址被别人占用,就会出现地址异常,甚至程序崩溃的情况。

所以一般对我们来说是不适用的,可以用来复制。 该API具有长度验证,可以减少类似的内存问题

功能:将字符串src中最多n个字符复制到字符数组dest中(遇到NULL时并不停止复制,而是等到n个字符足够才开始复制),并返回指向dest的指针

头文件:# 和

调用形式:char(char dest, char src, n);

注意:如果n > dest ,则dest堆栈空间溢出并发生崩溃异常。 该函数的注意点与此类似,但n的值需要特别注意。

1) src 字符串长度 dest 字符串长度

如果n=dest字符串的长度,则dest字符串中不存在NULL字符,这会导致输出出现乱码。 如果不考虑src字符串的复制完整性,可以将dest的最后一个字符设置为NULL。

因此,一般将n设置为dest的长度(包括null)(除非将多个src复制到dest)。 当2)中n=dest字符串长度时,定义dest为字符数组,因为此时不存在空字符副本。

示例代码:

#include
#include
int main()
{
 char name[]={"Hello World!"};
 char dest[20]={};
 strncpy(dest,name,12);
 printf("%s\n",dest);
}

输出:

Hello World!

功能:该函数将n个字符从s2指向的对象复制到s1指向的对象。如果复制发生在两个重叠的对象中,则此行为未定义

头文件:#

调用形式:void(void s1, const void *s2, n);

返回值:s1的值

注:用于复制内存中的数据。 由于字符串以“\0”结尾,因此只能用于数据中包含“\0”的数据。

与 类似,只不过它在终止空字符处停止。 当n>(s1)时,s2的不足空间补“\0”; 当 n

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON