当前位置:三九宝宝网 → 宝宝教育 → 教学论文 → 正文

c语言strcpy问题

更新:03-16 整理:39baobao.com
字体:

[c语言迷宫问题]问题出在MazePath内部的e是一个局部变量,并且随着while循环其内容不断变化。保存一个局部变量的地址是没有意义的,函数返回后就被清除。解决的办法是动态分配QElemType类型的...+阅读

先问你一个问题,你确定 这样的语句可以编译通过?至少 我使用的编译器是不能通过这样的语句的。因为 strcpy 你在修改"1234"这个常量区。这是非法的。haha 已经给出一个解释了,我只想再补充一下,sizeof(a)为什么从头到尾就没变过。因为sizeof这个看起来像是个函数其实他不是一个普通的函数,她是一个编译的宏。在编译的时候就已经写进去了,相当于 printf("%d\n",sizeof(a)); 编译完了之后 变成这样的语句printf("%d\n",5);他 已经彻彻底底跟a没有关系了。这个a是引用常量区的一个数组指针,他的定义char a[] 和 const char a[]是没有区别的。由于他是一个常量,因此他的大小 在编译阶段才能得知,因此 编译器看到 sizeof(a)的时候 编译器量了一下它的大小 然后写了个5 上去。就是这样的。

...

C语言 strcpy的问题

首先对俩指针做非零判断,然后保存res—dest(为了最后返回该指针),利用第二个字符串的'\0'字符作为判断条件,while(。。。),循环一次指针+1,直到'\0'结束,最后加上*p='\0',返回开始保存的初始指针 char *strcpy(char *strDest, const char *strScr){ char *address=strDest; assert((strDest != NULL) & (strScr != NULL)); while(*strScr) //是while(*strScr != '\0')的简化形式; { *strDest++ = *strScr++; } *strDest = '\0'; //当strScr字符串长度小于原strDest字符串长度 return address; //时,如果没有改语句,就会出错了。}...

c语言程序有关strcpy问题

问题出在形参类型char **。对bai于char **类型的p,p++只是使p指向du下zhi一个char*位置,而不能指向实参数组dao的下一行。可以这样:#include#includevoid Init_Meun(char p[][20]) //这里改为回答 char p[][20]{ int t; strcpy(*p++,"lookup"); //这里改为p++ strcpy(*p++,"create"); strcpy(*p++,"length"); strcpy(*p++,"middle of L"); strcpy(*p,"quit"); //这里改为p}int main(void){ StaticLinkList space1; int i; char Menu1[5][20]={"abc","efg","hij"}; //这里改为Menu1[5][20] ... Init_Meun(Menu1); return 0;}

挑战C面试题:到底怎样写出一个无懈可击的strcpy函数

首先,我想说你是不是面试的时候被这个题目打击到了???其次,我想说,生活,包括程序,都是有无数的的意外的。a)有些意外是我们可以根据生活经验可以完全预见的(比如生活中的到高压线上荡秋千,比如程序中的数组越界);b)有些意外是可以预见,不是经常发生,但是可能性比较大的(比如生活中的游泳溺水,比如程序中的 new 内存分配失败);c)有些意外是可以预见,但是可能性比较小的,基本上不会发生的,除非出现很严重的情况(比如生活中被雷劈到,比如程序中的 if (p==0) 失败,c = 100 失败,基本上是你的操作系统或者 CPU 挂了。。。。)接着,我想说,生活,包括程序,所谓的避免意外,不是只避开所有意外情况,而是避开大部分的意外情况(比如意外 a 和意外 b ),这样基本上生存的就比较好了,程序跑的也挺流畅了。

你要避开小概率的意外(比如意外 c),你会活得很累的,程序也庞大的无法想象了,根本跑不起来了!最后,编程的人的所谓追求完美,不是自欺欺人的。我们的完美不是静止的,是在不断完善的,没有止境的! #includeusing namespace std;char *strcpy( char *to, const char *from ){ /* 首先,通过指针变量是【无法判断出指针指向的内存的大小】的。 你【不知道】 to 指针和 from 指针指向的空间的大小。 你【只知道】 to 和 form 指针的本身的大小是 4 个字节的(在 x86 机器上) 这样你就遇到【第一个问题】了:如何知道【要拷贝的字符串】结束了(要拷贝的字符串首地址是 from)? 对于 from 指针指向的字符串,你可以说字符串有个结束符 '\0',但这个不是【强制的】。 比如 char s1[4]; char s2[4] = {'a','b','c','d'}; // s2 不是一个标准的 C 字符串! strcpy(s1,s2); 因为 s2 没有结束符 '\0' ,而在 strcpy 函数里面, 【只能通过这个结束符 '\0' 】来判断一个要复制的【字符串的结束】, 比如: while((*from) != '\0' ) // 这个是在任何拷贝函数里面必须出现的!!! { (*to) = (*from); from ++; } 你【永远不知道】from 出现了数组越界!你会一直遍历内存空间,直到遇到一个 '\0'。

你拷贝的永远不是真实的 s2 , 只是以 s2 开头的一块内存而已! 这是【没有办法解决的】【你连异常都无法捕获】! ---------------------------------------------------------------- 其次,即使【要拷贝的字符串】是老老实实的【用 '\0' 结束】的, 但是你不能保证【拷贝到的地方有足够的空间】容纳这个字符串! 比如 char s1[4]; // 拷贝到的地方只有 4 个字节空间 char s2[4] = {'a','b','c','d','\0'}; // 要拷贝的字符串占用 5 个字节空间(包括 '\0') strcpy(s1,s2); 同样的,在 strcpy 里面你也不能通过指针 to 来判断【拷贝到的地方 s1 的真实大小】(这里是4个字节) 你只能不管三七二十一的吧 from 指向的字符串全部拷贝到 to 指向的空间里(包括 '\0')! 你【永远不知道】 to 指向的数组是否已经越界!你会强占 to 后面连着的那块空间, 并在那里写入数据。

也许一些很重要的数据就被覆盖了!!! 这也是【没有办法解决的】【你连异常都无法捕获】! ---------------------------------------------------------------- 我保证,【没有人敢】,他能写出一个永不出错的 strcpy !!! 他只能保证, 【在 from 指向的字符串是正常结束的, 并且 to 指向的空间有足够的大小容纳 from 指向的字符串】, 的前提下,写出一个基本不会出错的 strcpy */ // 我承认我写不出你要的 strcpy。。。。 } int main(int argc, char *argv[]){ return 0;}

本文地址:https://www.39baobao.com/show/29_48645.html

以上内容来自互联网,请自行判断内容的正确性。若本站收录的信息无意侵犯了贵司版权,请联系我们,我们会及时处理和回复,谢谢.

以下为关联文档:

迷宫问题 C语言#include<stdio.h>int main(void){ int maze[100][100]; int MAZE[100][100]; int m,n; int p,q; printf("输入迷宫的行数m,列数n:\n"); scanf("%d%d",&m,&n); for(p=0;p<=n+1;p++)...

c语言:数组:不用strcpy函数实现字符串的复制#include<stdio.h> void Copy_string(char* str1, char* str2); //函数声明 int main() { char str1[20]; char str2[20]; puts("请输入字符串str1:"); gets(str1); //获取从键盘...

c语言问题while执行语句问题执行了n次,为什么呢?? 从基础慢慢分析吧 while(布尔值)语句 这个你应该知道的吧 意思就是如果while里的 “布尔值” 是 “真” 的时候, “语句” 就会执行 如果是 “假” while 就...

编C语言程序用自定义函数实现字符串处理函数strcat strcpy/*** *char *strcat(dst, src) - concatenate (append) one string to another * *Purpose: * Concatenates src onto the end of dest. Assumes enough * space in dest. *...

用C语言程序通过自定义函数实现字符串处理函数strcat strcpy0.0+【我自己做的 【strlen { char ch1[10]="abc"; int i; for(i=0;ch1[i]!='\0';i++);//循环到不是\0为假(结尾) printf("len=%d",i);//循环次数就是字符串的长度 getch(); } 【str...

编C语言程序:用自定义函数实现字符串处理函数strcat strcpy/*** *char *strcat(dst, src) - concatenate (append) one string to another * *Purpose: * Concatenates src onto the end of dest. Assumes enough * space in dest. *...

c语言递归问题:汉诺塔问题假设最初有3个盘子,目标是柱子A移到柱子C上,柱子从左到右是A,B,C,我给你说明一下过程: 1.move(2,a,b);move(1,a,c);move(2,b,c);//将2个盘子从A移到B上,再将剩下的1个从A移到C上,最...

C中的strcpy怎么用C中的strcpy怎么用,在C语言中字符串复制函数 strcpy怎样使用:原型:extern char *strcpy(char *dest,char *src); 用法:#include功能:把src所指由NULL结束的字符串复制到dest所指的...

关于C语言strcpy函数的练习题球详细解!关于C语言strcpy函数的练习题球详细解!C语言中strcpy函数的第一个参数不能是字符指针吗:A.我认为运行是可以运行但是可能会出现问题。 首先s1[]是字符数组,数组名s1代表该数组...