strcpy 数组越界_
1.关于C语言字符串数组和字符指针相互赋值问题
2.vs2008中为什么使用strcpy不安全而用strcpy_s替换(尽量详细点)
3.求C语言二维数组问题。。(30分)
4.C++初学者使用strcpy函数时遇到的困惑:
5.几道C语言数组的选择题。,一题一分
6.程序段 char a[7]="abcdef";char b[4]="ABC";strcpy(a,b);printf("%c",a[5]);
7.数组跟字符串有什么联系和区别
8.请问结构体数组赋值的方法?具体看下面
1、使用区别
scanf()不会检查输入边界,可能造成数据溢出。
scanf_s()会进行边界检查。
2、意思
scanf表示从键盘输入指定格式的数据。如:scanf("%d",x);指从键盘给x输入一个int型(整型)数据;scanf("%f",x);指从键盘给x输入一个float型(实型)数据;
对应的输出为:printf?按照指定的格式输出数据;如printf("%d",x);?指按整型数据输出X中的值。
因为带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。
3、scanf_s()参数与scanf()不同
例如scanf(“%s”,&name,n),整形n为name类型的大小,如果name是数组,那n就是该数组的大小。
关于C语言字符串数组和字符指针相互赋值问题
1、strcpy 函数使用方法:
strcpy()函数是C语言中的一个复制字符串的库函数。
2、空指针检查:源指针和目的指针都有可能会出现空指针的情况,所以应该对其进行检查。
3、const 修饰:源字符串参数用const修饰,防止修改源字符串;
4、为什么要设置ret 指针以及返回ret指针的位置[3],由于目的指针dst已经在进行移动了,所以用指针ret表明首指针;
扩展资料:
strcpy 函数的错误用法及反馈:
1、不检查指针的有效性,说明答题者不注重代码的健壮性。
2、(A)return new string("Invalid argument(s)");,说明答题者根本不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中返回函数体内分配的内存是十分危险的做法,他把释放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。
3、(B)return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。
4、(A)忘记保存原始的strDest值,说明答题者逻辑思维不严密。
百度百科 -?strcpy
vs2008中为什么使用strcpy不安全而用strcpy_s替换(尽量详细点)
你这个程序错误太多,没崩溃算是运气好
首先:char filename[50]="C:\\RequestData";这句涉及到指针强转,会将filename指向"C:\\RequestData"所在的地址,在对filename进行操作时就有可能崩溃。
其次:char * fileArray[56];是指针数组,存储了56个char *型指针,而你这样儿fileArray[i] = filename;进行赋值是指针赋值,故fileArray中的每个元素都会指向"C:\\RequestData"所在的地址,这也是fileArray[0]--fileArray[55]的值全部是C:\RequestData的原因
这个程序需要修改的地方多着,看看指针及字符串操作方面的资料吧!
求C语言二维数组问题。。(30分)
strcpy_s 函式是 strcpy 的安全版本,属于 ISO/IEC TR 24731 的标准, 某些 C 函式库支援这个函式,包含 Microsoft C Runtime Library(微软 C 语言执行时期函式库)。它与 strcpy 的不同在于,在它取得额外参数来决定目的缓冲区大小时,会因为发生溢位而出现错误,如此一来,就可以预防缓冲区溢位。由于 strcpy_s 对于 C 语言来说是新的函式,所以没有特别受到广泛支援。
例如, 我们有个数组: unsigned char buf[2];
当我们使用strcpy(buf, "1234567")时, 以buf为起点的*(buf+3)也就是buf[3]被写入值, 但是, 此时也许这个buf+3这个位置被其它的程序或变量使用时, 则会改变其它变量的值.
而strcpy_s(buf,2,"1234567")则告诉程序它只有两个字节, 此时, 程序不会将数据写入到 buf+3的地址中, 所以它更安全.
C++初学者使用strcpy函数时遇到的困惑:
1.元素array[i][j]前面有i*m+j个元素。
2.数组第一维的大小是2。
3.对
4.a[0][0]、a[1][2]、a[1][0]是正确引用。
5.int a[2][]={{1,2,3},{4,5,6}};一维可省,二位不可省;
int a[2][4]={{1,2,3},{4,5},{6}};越界了,只定义了两行却赋了三行的值;
int a[][3]={{1,2,3}{},{1,1}};第一第二列中间少了一个逗号,括号内不能没有元素。
几道C语言数组的选择题。,一题一分
原因:
这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。
方法一:将原来的'strcpy替换成strcpy_s。
方法二:用以下方法屏蔽这个警告:
1. 在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:
#define _CRT_SECURE_NO_DEPRECATE
2. 或声明 #param warning(disable:4996)
3. 更改预处理定义:
项目->属性->配置属性->C/C++ -> 预处理器 -> 预处理器定义,增加:
_CRT_SECURE_NO_DEPRECATE
程序段 char a[7]="abcdef";char b[4]="ABC";strcpy(a,b);printf("%c",a[5]);
1、B 这两种定义不同,因为x字符串后面有\0,多1个字节。
2、D 字符串只能这么比较
3、A 该程序就是将字符串转变为整型
4、B 选项D不行,必须在语句前申明变量
5、B
6、C 只能省略第一个值
7、C
8、B 只能省略第一个值
9、C 注意数组边界,a[4]是0~3,没有4。
10、D
11、D 举几个特例
12、B scanf输入字符串是不用加&的(和变量不同),gets()只能有一个参数,即gets(a);
13、1a[i]2i % 4 == 03printf("\n");
数组跟字符串有什么联系和区别
是f,这个函数是把数组b中的元素拷贝到a数组中,由于遇到结束字符就结束了,a所以数组中的前三个字母被b数组代替了,但是后面三个不会变,在这有可能误认为输出是e,是因为忽略了a数组下表是从0开始的,所以a[5]是指第六个数,也就是f
请问结构体数组赋值的方法?具体看下面
简单点说:
数组是一段连续的内存,而字符串也是一串连续的内存,所以字符数组和字符串很大程度上有共同的性子,比如:
char array[4]={“abc”};//注意有一个串结束标志,数组不可以越界
char *p;
p=array;//这样就可以利用指针p运算字符数组array了,此时p指向的是数组第一个元素的地址
如果char *pt="abc"; pt指针也是指向a的地址,同样可以运算了。
区别在于字符串可以使用字符串函数:gets,puts,strlen,strcmp等等,实用字符串函数使处理字符串更方便了。
另外,字符在内存中是以ascll码存储的,以%d格式输出一个字符就是输出它的ascll码,\(字符ascll码)这种方式可以引用一个字符。
给你一些我简单总结的几个字符串函数,还不是很全,不过一般常用的可以了。
字符串处理函数:
字符串函数可分为:字符串输出(puts),输入(gets),合并(stract),拷贝(strcpy),比较(strcmp),转换,复制,搜索(strchr)
注意:这一章例题中的字符串可用指针代替。
1 字符串输出函数puts:
格式:puts(字符数组名);
功能:把字符数组中的字符串输出到显示器。
例:
#include <stdio.h>
main()
{
char a[]="made in china\r\nis well";
puts(a);
}
注意:puts()函数可以使用转义字符;
puts完全可以由printf函数取代,当要求按格式输出时通常用printf ;
puts()函数用来向标准输出设备(屏幕)写字符串并换行, 其调用格式为:
puts(s);
其中s为字符串变量(字符串数组名或字符串指针)。
puts()函数的作用与语printf("%s\n", s)相同。
例4:
main()
{
char s[20], *f; /*定义字符串数组和指针变量*/
strcpy(s, "Hello! Turbo C2.0"); /*字符串数组变量赋值*/
f="Thank you"; /*字符串指针变量赋值*/
puts(s);
puts(f);
}
2 字符串输入函gets:
格式:gets(字符数组名);
功能:从标准输入设备键盘上输入一个字符串;该函数得到一个函数值为该字符数组的首地址;
例:
#include <stdio.h>
main()
{
char a[15];
printf("in put a string:\r\n");
gets(a);
puts(a);
}
注意:gets函数不以输入中的“空格”为结束标志,这与scanf函数不同;
gets()函数
gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束, 但回车符
不属于这个字符串。其调用格式为:
gets(s);
其中s为字符串变量(字符串数组名或字符串指针)。
gets(s)函数与scanf("%s", &s)相似, 但不完全相同, 使用scanf("%s", &s)
函数输入字符串时存在一个问题, 就是如果输入了空格会认为输入字符串结束,
空格后的字符将作为下一个输入项处理, 但gets() 函数将接收输入的整个字符
串直到回车为止。
例5
main()
{
char s[20], *f;
printf("What's your name?\n");
gets(s); /*等待输入字符串直到回车结束*/
puts(s); /*将输入的字符串输出*/
puts("How old are you?");
gets(f);
puts(f);
}
3 字符串连接函数strcat:
格式:strcat(字符数组名1, 字符数组名2);
功能:把字符数组2里字符串连接到字符数组1里字符串的后边并删除字符串1的串结束标志’\0’;返回值为数组1的首地址,因此数组1要有足够的长度;
例:
#include <stdio.h>
#include <string.h>
main()
{
static char a[]="my name is ";
char b[15];
printf("in put your name\r\n");
gets(b);
strcat(a, b);
puts(a);
}
4 字符串拷贝函数strcpy:
格式:strcpy(字符数组名1, 字符数组名2);
功能:把字符数组2中的字符串拷贝到字符数组1中;字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
例:
#include <stdio.h>
#include <string.h>
main()
{
char a[20];
char b[]="made in china";
strcpy(a, b);
puts(a);
}
注意:要求字符数组1要有足够的长度。
5 字符串比较函数:
注意:1、逐字对比判断字符的ASCII码值大小。
2、比较到某个字符判断出大小时立即结束。输出非零。
3、字符串相同时输出零
strcmp:
格式:strcmp(字符数组名1, 字符数组名2);
功能:按照ASCII码的顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
字符串1=字符串2,返回值=0;
字符串1>字符串2,返回值>0;
字符串1<字符串2,返回值<0;
本函数可以比较两个字符串常量,或比较数组和字符串常量。
例:
#include <stdio.h>
#include <string.h>
main()
{
int k;
char a[20];
char b[]="i love china";
printf("in put s string\r\n");
gets(a);
k=strcmp(a, b);
if(k==0)
printf("a=b\r\n");
if(k>0)
printf("a>b\r\n");
if(k<0)
printf("a<b\r\n");
}
注意:不是比较字符串长度,而是比较ASCII码的大小,可用于姓名字母排序。
strncmp:
格式:strncmp(字符数组名1,字符数组名2,int length);
功能:比较字符串1和字符串2的前length个字符;
字符串1=字符串2,返回值=0;
字符串1>字符串2,返回值>0;
字符串1<字符串2,返回值<0;
例:
#include <stdio.h>
#include <string.h>
main()
{
int k;
char *a="I love china";
char *b="I am hy";
k=strncmp(a, b, 6);
if(k>0)
printf("the string b is greater than string a\r\n");
if(k<0)
printf("the string b is less than string a\r\n");
if(k==0)
printf"(" the string b is equal string a\r\n ")
}
strncmpi:
格式:strncmp(字符数组名1,字符数组名2,int length);
功能:比较字符串1和字符串2的前length个字符,不区分大小写;
例:
6 测字符串长度函数strlen:
格式:strlen(字符数组名);
功能:测字符串的实际长度(不含串结束标志’\0’,但转义字符算一个字符),并作为函数的返回值;
例:
#include <stdio.h>
#include <string.h>
main()
{
int k;
char a[]="i love china";
k=strlen(a);
printf("the length of string is:%d\r\n", k);
}
注意;字符串不能用==或者!= 的只能用函数。
7 字符搜索函数strchr:
格式:strchr(字符数组名,待找的字符);
功能:查找字符串中首次出现字符的位置,并返回出现字符位置的指针,若字符不存在则返回NULL;
例:
#include <stdio.h>
#include <string.h>
main()
{
char a[30];
char *p, c='n';
strcpy(a, "I love china");
p=strchr(a, c);
if(p)
printf("the character %c is at position %d\r\n", c, p-a);
else
printf("the character is not found:\r\n");
}
注意:倒数第三句的(p-a)用法。
我来分析一下,
struct se_account//保存登录帐户密码
{
char account[10];
char password[10];
}users[10] = {0};
这个我理解是定义了一个结构数组users[10], 并初始化为0.
也就是说user[]数组有10个元素,每个元素是上面的这样一个结构.
下面来看strcpy这个函数,是标准c库函数, 原型是
char * strcpy(char * strDest,const char * strSrc);
这个函数是把src所指由NUL结束的字符串复制到dest所指的数组中。
所以用这个函数,字符串必须以NULL结束,否则可能会发生访问越界. 而两个参数应该是数组首地址,所以如果要用这个函数,应该这样写strcpy(users[10].account,a);
可以构造一个循环,代码如下:
for(i = 0; i < 10;i++)
{
strcpy(users[i].account,a);
strcpy(users[i].password,pwd);
}
至于你提出的方法2的直接给数组附值,是不合法的.
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。