C++ C++;字符*问题 #包括 使用名称空间std; int main() { char*name=“Siva”,*str; for(int i=0;i
C++ C++;字符*问题 #包括 使用名称空间std; int main() { char*name=“Siva”,*str; for(int i=0;i,c++,C++,str[i]=name[i];是非法的,会导致未定义的行为,因为您尚未为str分配内存 for循环之前为目标字符串分配内存str: #include<iostream> using namespace std; int main() { int i=0; char *name="Siva",*str; for(i=0;i<strlen(name);i++) { str[i]=name[i]; } cout<&
str[i]=name[i];
是非法的,会导致未定义的行为,因为您尚未为str
分配内存
for循环之前为目标字符串分配内存str
:
#include<iostream>
using namespace std;
int main()
{
int i=0;
char *name="Siva",*str;
for(i=0;i<strlen(name);i++)
{
str[i]=name[i];
}
cout<<str;
return 0;
}
此外,您还忘记了字符串终止,在for循环之后添加terminate stringstr[i]='\0'
;指行为不可预测的计算机代码 您的代码应该是:
str = malloc (strlen(name) + 1 );
char*name=“Siva”,*str;
str=malloc(strlen(name)+1);//错误
对于(int i=0;i您在此处有未定义的行为:
char *name="Siva", *str;
str = malloc (strlen(name) + 1 ); // mistake
for(int i=0;i<strlen(name);i++)
{
str[i]=name[i];
}
str[i] = '\0'; // forgetting
str
尚未初始化为任何内容。您正在写入不应该写入的位置。这是因为您没有为str
分配内存(这将导致未定义的行为)
您可以使用以下示例中的merory分配函数来混合这一点:
str[i]=name[i];
#包括
使用名称空间std;
int main()
{
char*name=“Siva”,*str;
//使用malloc分配内存
str=(char*)malloc((strlen(name)+1)*sizeof(char));
对于(inti=0;i,这有两个问题
指针str
不指向已分配的内存,因此通过它进行写入是未定义的行为
即使它指向有效内存,您也没有写入正确的数据量。复制字符串时,您需要复制字符串末尾的0
字节,该字节标记字符串的结尾;因此循环的上限应为btstrlen(name)+1
。或者您可以使用类似strdup()的库方法
而不是您自己的循环
“工作”版本打印一些垃圾字符的原因是复制的字符串末尾没有0
来告诉iostreams
停止打印一个不会崩溃,另一个会崩溃,这纯粹是愚蠢的运气:str
中的垃圾碰巧指向允许写入的内存,而在崩溃的程序中,它指向不允许写入的内存。就这么简单。您的代码有几个问题
首先,*str没有被分配,所以它首先指向指针值恰好开始的内存位
其次,strlen()返回字符串的长度,不包括终止的空字符。因此,您要做的是将name的所有值复制到内存中的某个随机位,而不是终止它,然后告诉系统打印该值,可以是任意长度
#include<iostream>
using namespace std;
int main()
{
char *name="Siva",*str;
// Allocate memory with new
str = new char[strlen(name) + 1];
for(int i=0;i<strlen(name);i++)
{
str[i]=name[i];
}
str[strlen(name)] = 0;
cout<<str;
// Free the allocated memory
delete []str;
return 0;
}
更好的是,摆脱手写循环:
#include<iostream>
#include <string>
using namespace std;
int main()
{
char *name="Siva";
std::string str;
for(int i=0;i<strlen(name);i++)
{
str += name[i];
}
cout<<str;
return 0;
}
如果您真的必须使用字符*
,首先我会强烈质疑为什么,然后我会告诉您这样做:
const char* name = "Silva";
intmain()
{
const char*name=“Siva”;
char*str=new char[strlen(name)+1];//+1表示空终止符
strcpy(姓名,str);
cout您的问题是使用字符数组和指针来表示具有适当字符串类型的语言中的字符串
int main()
{
const char *name="Siva";
char* str = new char [strlen (name)+1]; // +1 for the null terminator
for (size_t i = 0; i < strlen (name); ++i )
str [i] = name [i];
str [strlen (name)] = '\0';
cout << str;
delete [] str;
return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
字符串name=“Siva”,str;
str=名称;
CUT问题是用<代码> STR[i] = NoM[i] < /Cord>你必须知道C++不关心
如Java或其他一些。因此,您必须为变量或指针分配内存,以避免这些问题。已经有很多答案,您也可以尝试
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name = "Siva", str;
str = name;
cout << str;
return 0;
}
当您完成复制时,不要忘记用null终止char数组
str=new char[strlen(name)+1];
你在写什么?str指向什么?你也想要一个答案吗?你只描述了你的程序是如何运行的,而不是问题是什么,或者你希望他们做什么,或者你期望他们做什么,当它给出第一种情况的答案时……char*name=“Siva”
甚至不应该编译没有错误(或者至少是警告)。我只是试图将值从name复制到str。但在第一种情况下,它工作正常…为什么它给出第一种情况下的正确答案…请先告诉我,然后它如何给出第一种情况下的答案…这是未定义的行为。任何事情都可能发生。“未定义”意味着“它可能工作,也可能不工作”。事实上,我认为“它可能会起作用”是一种误导。它看起来可能会起作用。但实际上从未起作用(可证明/可靠)@是的,当程序在未定义的行为下正确执行时,这是最糟糕的情况。它如何给出答案这是一个未定义的行为。有时,操作系统会让程序访问该内存。但更常见的情况是,最终出现分段错误
…”您应该这样做“-这一定是我以前不知道的“应该”这个词的奇怪含义。我改变了它,你是对的。我不得不假设你在这里扮演一个学究教授:std::copy(name,name+strlen(name),std::back\u inserter(str))
。来吧on@sehe只是想展示几种不同的方法来保护猫。你提到内存泄漏,但没有提到<代码>删除>代码>,以避免内存泄漏:如果你来自java,你可能会惊讶于C++有一个字符串类型(<代码> STD::String ),它管理内存。我知道C++比java多。也许我在学生时感到惊讶,我使用Turbo C++,没有字符串类,然后我自己做了一个完整的字符串处理。我知道,我不在乎——我检查了我的日历,看到现在是2013。但是,我的意思是你没有提到<代码>删除[]。<代码> >在代码>新版[]/COD>之后使用。正如您所看到的,C++演进(<代码> STD::String 在1998中被添加)以及它的用法。
char* name = "Silva";
std::string str = name;
cout << str;
const char* name = "Silva";
int main()
{
const char *name="Siva";
char* str = new char [strlen (name)+1]; // +1 for the null terminator
strcpy (name, str);
cout << str;
delete [] str;
return 0;
}
int main()
{
const char *name="Siva";
char* str = new char [strlen (name)+1]; // +1 for the null terminator
for (size_t i = 0; i < strlen (name); ++i )
str [i] = name [i];
str [strlen (name)] = '\0';
cout << str;
delete [] str;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name = "Siva", str;
str = name;
cout << str;
return 0;
}
str=new char[strlen(name)+1];
str[strlen(name)]='\0';