C++ 为什么我的字符复印机返回不同的东西?
编写一个简单的字符串复制器并在main()函数中进行测试。奇怪的是,有时程序会返回 “你好” 应该这样,但也许每运行三次,程序就会打印出: “你好!你好!▌▌▌▌▌▌▌▌▌▌▒"UòB╚" 为什么垃圾数据的尾部有时只添加到第二个字符串的末尾C++ 为什么我的字符复印机返回不同的东西?,c++,pointers,copy,c-strings,garbage,C++,Pointers,Copy,C Strings,Garbage,编写一个简单的字符串复制器并在main()函数中进行测试。奇怪的是,有时程序会返回 “你好” 应该这样,但也许每运行三次,程序就会打印出: “你好!你好!▌▌▌▌▌▌▌▌▌▌▒"UòB╚" 为什么垃圾数据的尾部有时只添加到第二个字符串的末尾 #include <iostream> using namespace std; int strlength(const char* c) { int size = 0; while (*c) { ++c;
#include <iostream>
using namespace std;
int strlength(const char* c)
{
int size = 0;
while (*c) {
++c;
++size;
}
return size;
}
char* mystrdup(const char* c)
{
int size = strlength(c);
char* result = new char;
copy(c, c + size, result);
return result;
}
void print_array(const char* c)
{
int size = strlength(c);
while (*c) {
cout << *c;
++c;
}
}
int main()
{
char test[] = "Hello!";
char* res = mystrdup(test);
print_array(test);
print_array(res);
}
#包括
使用名称空间std;
int strlength(常量字符*c)
{
int size=0;
而(*c){
++c;
++大小;
}
返回大小;
}
char*mystrdup(const char*c)
{
int size=strlength(c);
字符*结果=新字符;
副本(c,c+大小,结果);
返回结果;
}
无效打印数组(常量字符*c)
{
int size=strlength(c);
而(*c){
cout您的代码中有多个错误。您分配了错误的内存(char而不是char数组)。您没有删除内存。请停止使用C-string并使用std::string
#include <iostream>
#include <string>
using std::cout;
void print_array(const char* c)
{
while (*c) {
cout << *c;
++c;
}
}
int main()
{
std::string = "Hello!";
std::string res = test;
print_array(test.c_str());
print_array(res.c_str());
}
#包括
#包括
使用std::cout;
无效打印数组(常量字符*c)
{
而(*c){
cout程序有未定义的行为,因为您没有为结果字符串分配足够的内存
char* mystrdup(const char* c)
{
int size = strlength(c);
char* result = new char;
^^^^^^^^^^^^^^^^^^^^^^^
copy(c, c + size, result);
return result;
}
此外,您没有将终止零复制到结果字符串
char* mystrdup(const char* c)
{
int size = strlength(c);
char* result = new char;
^^^^^^^^^^^^^^^^^^^^^^^
copy(c, c + size, result);
return result;
}
至少两个函数strlength
和mystrdup
可以如下所示
size_t strlength( const char *s )
{
size_t size = 0;
while ( s[size] ) ++size;
return size;
}
char * mystrdup( const char *s )
{
size_t size = strlength( s ) + 1;
char *result = new char[size];
copy( s, s + size, result );
return result;
}
当然,您可以使用标题
中声明的标准C函数strcpy
来代替标准算法std::copy
并且不要忘记删除分配的数组
char* res = mystrdup(test);
//…
delete [] res;
请注意,函数print\u array
不使用变量size
。不需要逐个字符输出C字符串
该函数的定义如下
std::ostream & print_array( const char *s, std::ostream &os = std::cout )
{
return os << s;
}
std::ostream&print_数组(const char*s,std::ostream&os=std::cout)
{
在strcpy中返回os,您需要创建一个字符大小
char* mystrdup(const char* c)
{
int size = strlength(c);
char* result = new char[size];
copy(c, c + size, result);
return result;
}
可能您忘记添加一个\0。请退出所有这些内容并使用STL。如果此代码是您的教学课程的结果,请立即退出。两个词:空终止。第二个char*result=new char;
--只有一个字符?编写一个简单的字符串复制器并在main()中测试它功能。--在一个不平凡的程序中尝试一下,你会发现维护和使用任何类似的东西都不是那么简单。如果你想提高技能,就编写一个真正的字符串类,而不是这些一次性的字符串操作例程。令人惊讶的是,有多少编程课程完全忽略了编程的难点:制作当然,这个程序在25年后仍然有效。@ AddiDebug确实是有用的,但是它们应该在C编程课中教。C++课程中的C语言已经让世界上有大量年轻程序员认为他们知道C++而不知道。