strcat strcpy 使用出现的问题汇总
{
char *Temp=(char *)malloc(sizeof(char)*200);
Temp="strcat";
char *Append=" a test program!";
strcat(Temp,Append);
printf("%s\r\n",Temp);
return 0;
}
在vc6中编程如下函数:
- #include "stdafx.h"
- #include
- #include
- using namespace std;
- int main(int argc, char* argv[])
- {
- char *p="abcde";
- int l=strlen(p);
- char *s="12345";
- strcpy(p,s);
- strcat(p,s);
- return 0;
- }
编译时可以通过,运行时却会出现access violation,这个错误的意思是说访问了一块已经失效的内存,究其原因,char *p="abcde",这一行在执行时,"abcde"(字符串常量)是位于文字常量区,这个区域的内容是不能修改的,而p这个指针变量是位于栈区,也就是说p指向了文字常量区的一个字符串。下面一行char *s的意义相同。
当在执行strcpy(p,s)时,它试图将p所指向的一块内存区域中的内容修改,而这是不可能的,所以会出现上面的那个错误,在执行strcat(p,s)时,它也是试图在修改文字常量区的内容,所以会错误。
当改成以下代码时就不会出现错误:
- #include "stdafx.h"
- #include
- #include
- using namespace std;
- int main(int argc, char* argv[])
- {
- char *p="abcde";
- int l=strlen(p);
- char *s="12345";
- //strcpy(p,s);
- //strcat(p,s);
- char a[]="abcde";
- char b[]="12345";
- char c[6];
- strcat(a,b);
- strcpy(c,b);
- return 0;
- }
此时就不会出错,因为char a[]="abcde"和char *p="abcde"它们的意义是完全不同的,前者的指针变量a是在栈区的,它所指向的"abcde"也是在栈区的,也就是说,a所指向的内存中的内容是可以被修改的。strcat(a,b)的意义也是类似的。
3,strcpy用法:
strcat strcpy 使用出现的问题汇总的更多相关文章
- strlen strcat strcpy strcmp 自己实现
strlen strcat strcpy strcmp 自己实现 strlen include <stdio.h> #include <string.h> #include & ...
- 自己实现字符串操作函数strlen(),strcat(),strcpy(),strcmp()
1.strlen()函数是求解字符串的有效长度的 1)非递归实现 size_t my_strlen(const char *str) { assert(str != NULL); //断言,保证指针 ...
- strlen sizeof strcat strcpy区别
strlen(p): 能计算出p指向字符串的长度(以当前p的位置开始),不包含终止字符'\0': p可以声明为char* p或者char p[],这两种形式strlen均能正确计算. sizeof ...
- strcat strcpy 源代码,用指针去实现
15. 指针实现 strcmp函数 • int newStrcpy(char *p, char *q) • { • while(*p ==*q) { ...
- 字符串操作函数<string.h>相关函数strcpy,strcat,等源码。
首先说一下源码到底在哪里找. 我们在文件中包含<cstring>时,如果点击右键打开文档, 会打开cstring,我们会发现路径为: D:\Program Files\visual stu ...
- 由strcat函数引发的C语言中数组和指针问题的思考
问题一 首先,来看一下下面这段代码: #include <stdio.h> #include <string.h> int main() { char *str = " ...
- c++语言知识点汇总
c++ primer version-5 的整理 section 1: 内置类型和自定义类型: main函数的返回值:指示状态.0:成功:1:系统定义. unix和win系统中,执行完程序可以使用ec ...
- SCNU 2015ACM新生赛初赛【1007. ZLM的扑克牌】解题报告
题目链接详见SCNU 2015新生网络赛 1007. ZLM的扑克牌 . 其实我在想这题的时候,还想过要不要设置求最小的排列,并且对于回文数字的话,可以把扑克牌折起来( ...
- 慕课网:C++ & 数据结构
课程链接:james_yuan的课程 这部分太枯燥了,如果教材难度稍大,根本就学不下去,所以就先看看通俗的视频吧. 课程目录 1.C++远征之起航篇 - C++亮点尽在其中 2.C++远征之离港篇 - ...
随机推荐
- ajax请求后弹开新页面被浏览器拦截
window.open()我想应该很多人都不陌生吧,它可以实现除用a标签以外来实现打开新窗口! 最近开发项目用到时,却遇到了麻烦,本来好好的弹出窗口,结果被浏览器无情的给拦截了! 代码如下: $.ge ...
- MapReduce 2简介
在Hadoop 1.0版本中,mapred.job.tracker决定了执行MapReduce程序的方式,若设置为local,则使用本地的作业运行器,若设置为主机:端口(eb179:9001),则该配 ...
- PHP 载入图像 imagecreatefrom_gif_jpeg_png 系列函数
imagecreatefrom 系列函数用于从文件或 URL 载入一幅图像. 载入图像 imagecreatefrom 系列函数用于从文件或 URL 载入一幅图像,成功返回图像资源,失败则返回一个空字 ...
- phoenix与spark整合
目的是将phoenix做存储,spark做计算层.这样就结合了phoenix查询速度快和spark计算速度快的优点.在这里将Phoenix的表作为spark的RDD或者DataFrames来操作,并且 ...
- [Eclipse] - 集成JBoss7热加载和自动发布
使用Eclipse + JBoss开发时,总是要重启项目或JBoss,烦人.下面方法可以很简单的实现Eclipse + JBoss热加载和自动发布. 我的环境是JBoss 7.1.1 Final 1) ...
- 也谈Oracle异常: ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
场景: .Net程序调用Oracle方法 command.ExecuteNonQuery()执行存储过程;弹出如标题异常信息. 存储过程有4个输入参数,一个输出参数.一旦执行到给输出参数赋值的时候就报 ...
- 使用ADD_CUSTOM_COMMAND 添加自定义命令
e.g. ADD_CUSTOM_COMMAND( TARGET world_server COMMAND cp ${CMAKE_SOURCE_DIR}/CMak ...
- 【解决】SharePoint外部列表保存的日期/时间值不正确
[问题描述]: 在SharePoint中创建一个外部列表后,通过工作流或直接通过外部列表中的新增向外部列表添加数据项.通过外部列表或数据库查看添加的数据项时发现日期类型字段的值都不正确,像是差了若干个 ...
- IDEA中PlantUML的使用
PlantUML官网地址:http://www.plantuml.com/ IDEA中安装PlantUML Plugins File-->Settings-->Plugins-->I ...
- Android Studio JNI/NDK 编程(二) Windows 下环境搭建 demo 开发
环境 windows 8 (注:其实 Linux 开发可能更方便) Android Studio 2.1; 一 . 下载 安装android-ndk开发包 地址:链接:http://pan.baid ...