`
jiagou
  • 浏览: 2530156 次
文章分类
社区版块
存档分类
最新评论

C/C++数组边界与赋值

 
阅读更多
声明: char buf[5]; 则元素为 a[0] a[1] a[2] a[3] a[4]
a[5]不属于buf数组 该数组可以最多存放a[0] a[1] a[2] a[3] 这4个字符, 而因为字符数组的第5个a[4]字符用于/0

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

int main()
{
char str[5];
char c='d';

strcpy(str,"hello"); //string copy (include '/0')

printf("d:%d c:%c str:%s /n", c,c, str );

if(c == '/0')
printf("c == '//0' /n");
else
printf("c != '//0' /n");

return 0;
}

[root@localhost cpp]# ./a
d:0 c: str:hello
c == '/0' //可见strcpy把str[5]也就是char c的内存空间填入了/0

正确的做法是


[root@localhost cpp]# cat a.c
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
char str[5];
char c='d';

strncpy(str,"hello",sizeof(str)-1); //str copy (不包含'/0', 也就是到达源串尾也不自动添加/0)
//
str[4]='/0';
printf("d:%d c:%c str:%s /n", c,c, str );

if(c == '/0')
printf("c == '//0' /n");
else
printf("c != '//0' /n");

return 0;
}


[root@localhost cpp]# ./a
d:100 c:d str:hell
c != '/0'


不加str[x]='/0'
[root@localhost cpp]# cat a.c
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
char str[6];
char c='d';

strncpy(str,"hello",sizeof(str)-1); //str copy ( '/0')
//
//str[5]='/0'; 不添加/0会引起下面的乱码错误, 随后的变量c的内容也未可预料
printf("d:%d c:%c str:%s /n", c,c, str );

if(c == '/0')
printf("c == '//0' /n");
else
printf("c != '//0' /n");

return 0;
}


[root@localhost cpp]# ./a
d:100 c:d str:helloSd0瓯繄瓯?jO狘SO堦笨,jO
c != '/0';
;;;;;;;;;;;;;;;总结;;;;;;;;;
使用 strcnpy函数时正确做法:
char array[80];
const char *src = "sdjfksdfjksdf";
;;;;第一种方式
strcnpy(array, src, sizeof(array));
array[sizeof(array) - 1] = '/0'; // 为避免 src 长度超过80(包括'/0') 时array数组末尾没有加‘/0’.导致缓冲区溢出。
;;;;;;;;;第二种方式;;;;;;;;
memset(array, 0, sizeof(array));
strncpy(array, src, sizeof(array) -1); // 这样,由于memset 把 array 添0,所以保证array[sizeof(array) -1] = '/0';
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
当src 长度小于80 时 没有问题。注意,strncpy()不会自动添加 '/0';
除非 你能保证 src的长度不会超过array的长度,这时可以直接用 strcpy(array, src);

分享到:
评论

相关推荐

    C++/C编程规范

     本书涵盖了C++程序设计的每一个方面,包括设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、STL容器和算法等。书中对每一条规范都给出了言简意赅的概述,并...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    5.5.2 字符数组的赋值与引用 5.5.3 字符串和字符串结束标志 5.5.4 字符数组的输入输出 5.5.5 字符串处理函数 5.5.6 字符数组应用举例 *5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    5.5.2 字符数组的赋值与引用 5.5.3 字符串和字符串结束标志 5.5.4 字符数组的输入输出 5.5.5 字符串处理函数 5.5.6 字符数组应用举例 *5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和...

    高质量 C++/C 编程指南

    , 涵盖了C++程序设计的每一个方面,包括设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、STL容器和算法等。书中对每一条规范都给出了言简意赅的叙述,并辅以...

    C++编程规范

    , 本书涵盖了C++程序设计的每一个方面,包括设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、STL容器和算法等。书中对每一条规范都给出了言简意赅的叙述,并...

    在一小时内学会 C#(txt版本)

    3. 超出数组边界的表达式索引值同样不可访问。 4. C# 中没有全局变量或全局函数,取而代之的是通过静态函数和静态变量完成的。 数据类型 所有 C# 的类型都是从 object 类继承的。有两种数据类型: 1. 基本/内建...

    带音效的VC++俄罗斯方块游戏

    内容索引:VC/C++源码,游戏编程,俄罗斯方块 今天再次发一个经典的俄罗斯方块游戏的源程序,...如何判断是否接触并且判断碰撞遇到了边界或者有其他方块档住,如何移动位置后重新给数组赋值等,详细内容请参阅代码吧。

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    华为编程开发规范与案例

    软件编程规范培训实例与练习 软件编程规范培训实例与练习  问题分类 1 逻辑类问题(A类)-指设计、编码中出现的计算正确性和一致性、程序逻辑控制等方面出现的问题,在系统中起关键作用,将导致软件死机、功能...

    c#学习笔记.txt

    很多人觉得它应该像C或者C++,但事实上它更像是java的一个clone,所以作为入门,读一下清华大学出版社出版的《Java 语言与面向对象程序设计》可能会对你有所帮助。本文假定你具备一切学习此语言所需的知识,没有也不...

    易语言程序免安装版下载

     支持静态链接其它编程语言(如C/C++、汇编等)编译生成的静态库(.LIB或.OBJ),但仅限于COFF格式,支持cdecl和stdcall两种函数调用约定。  使用说明如下:函数声明和调用方法与DLL命令一致;“库文件名”以.lib...

Global site tag (gtag.js) - Google Analytics