C++ 为什么我的字符复印机返回不同的东西?

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;

编写一个简单的字符串复制器并在main()函数中进行测试。奇怪的是,有时程序会返回

“你好”

应该这样,但也许每运行三次,程序就会打印出:

“你好!你好!▌▌▌▌▌▌▌▌▌▌▒"UòB╚"

为什么垃圾数据的尾部有时只添加到第二个字符串的末尾

#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++而不知道。