//把字符串复制给另一个字符串,没想到是这样的结果。
//代码出错在字符串cha比ch1大,
//但为什么输出的结果这么怪呢?
#include "stdafx.h"
#include
#include
int main(int argc, char *argv[])
{
using namespace std;
char cha[]="abcde";
char ch1[]="123";//这句如改成 char ch1[]="12"; 或许还能理解 ,但为什么?
cout<<"cha---"<<cha<<endl;
cout<<"ch1---"<<ch1<<endl;
cout<<"-----strcpy(ch1,cha);-----"<<endl;
strcpy(ch1,cha);
cout<<"cha---"<<cha<<endl;
cout<<"ch1---"<<ch1<<endl;
cin.get();
cin.get();
return 0;
}
你得首先弄明白
1、char cha[]="abcde"; 究竟存了什么
2、cout 打印字符串的原理
3、strcpy 复制的是什么东西
cha 真正存储的数据是 abcde\0 ,这个数组的长度是6,不是5
同理,ch1 存储的数据是 123\0 ,数组的长度是 4,不是3
cout 打印 char[] 数组的时候,不管数组有多长,是一直往后打印字符,即使越界了也会继续打印,直到遇到字符 '\0' 为止。
strcpy 复制,是不会复制 '\0' 的,只会把源数组 '\0' 之前的数据全部压到目标数组
回到你这程序,
strcpy(ch1,cha);
你自己也知道,cha 比 ch1 长度要长, 于是,ch1 被改写成 abcde, 没错 '\0' 丢了
那么 cout 打印完 abcde 只后,还一直往后打印内存数据,所以你会看到很多奇怪的内容,直到刚好有个内存块的值等于 '\0',打印结束。
谢谢 小優YoU 的回答!!!
代码很简单,就一句 “ strcpy(ch1,cha); ”,
本意是把 字符串cha[]="abcde", 复制给 字符串ch1[]="123"。
意外地得到的结果是,字符串cha 变成了 字符串"e" ,字符串ch1变成了”abede"
问题不在'\0' ,
cout<<ch1; 输出了字符串“abced”这证明ch1被改写成 abcde后, ’\0‘也没丢了。
cout<<cha; 输出了字符串“e“当然‘\0’也没丢。
百思不得解的是: 常量字符串 cha "abcde"被改写成了"e".
当然很明显代码错误在字符串”abcde“比”123“占内存大。
这个错误为什么导致常量字符串cha被改成“e”,而且能通过编译器呢?
谢谢 小優YoU 的回答!!!
代码很简单,就一句 “ strcpy(ch1,cha); ”,
本意是把 字符串cha[]="abcde", 复制给 字符串ch1[]="123"。
意外地得到的结果是,字符串cha 变成了 字符串"e" ,字符串ch1变成了”abcde"
问题不在'\0' ,
cout<<ch1; 输出了字符串“abcde”这证明ch1被改写成 abcde后, ’\0‘也没丢了。
cout<<cha; 输出了字符串“e“当然‘\0’也没丢。
百思不得解的是: 常量字符串 cha "abcde"被改写成了"e".
当然很明显代码错误在字符串”abcde“比”123“占内存大。
这个错误为什么导致常量字符串cha被改成“e”,而且能通过编译器呢?