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.请问结构体数组赋值的方法?具体看下面

strcpy 数组越界_

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的直接给数组附值,是不合法的.