为什么我的 char* 复印机 return 不同?
Why does my char* copier return different things?
编写一个简单的字符串复制器并在 main() 函数中对其进行测试。奇怪的是有时程序 returns
"HelloHello"
就像它应该的那样,但也许每三次我 运行 它,程序打印出:
"Hello!Hello!▌▌▌▌▌▌▌▌▌▌▒"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);
}
您的代码中存在多个错误。您分配了错误的内存(char 而不是 char 数组)。你不删除记忆。停止使用 C 字符串并使用 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());
}
程序有未定义的行为,因为您没有为结果字符串分配足够的内存。
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;
}
当然,您可以使用 header <cstring>
.
中声明的标准 C 函数 strcpy
而不是标准算法 std::copy
strcpy( result, s );
并且不要忘记删除分配的数组。
char* res = mystrdup(test);
//…
delete [] res;
注意函数print_array
没有使用变量size
。不需要逐个字符输出一个C-string
函数可以这样定义
std::ostream & print_array( const char *s, std::ostream &os = std::cout )
{
return os << s;
}
最后,标识符 c
通常与 char
类型的单个 objects 一起使用。如果你处理一个字符串,那么最好使用标识符 s
.
在 strcpy 中你需要创建一个字符大小。
char* mystrdup(const char* c)
{
int size = strlength(c);
char* result = new char[size];
copy(c, c + size, result);
return result;
}
编写一个简单的字符串复制器并在 main() 函数中对其进行测试。奇怪的是有时程序 returns
"HelloHello"
就像它应该的那样,但也许每三次我 运行 它,程序打印出:
"Hello!Hello!▌▌▌▌▌▌▌▌▌▌▒"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);
}
您的代码中存在多个错误。您分配了错误的内存(char 而不是 char 数组)。你不删除记忆。停止使用 C 字符串并使用 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());
}
程序有未定义的行为,因为您没有为结果字符串分配足够的内存。
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;
}
当然,您可以使用 header <cstring>
.
strcpy
而不是标准算法 std::copy
strcpy( result, s );
并且不要忘记删除分配的数组。
char* res = mystrdup(test);
//…
delete [] res;
注意函数print_array
没有使用变量size
。不需要逐个字符输出一个C-string
函数可以这样定义
std::ostream & print_array( const char *s, std::ostream &os = std::cout )
{
return os << s;
}
最后,标识符 c
通常与 char
类型的单个 objects 一起使用。如果你处理一个字符串,那么最好使用标识符 s
.
在 strcpy 中你需要创建一个字符大小。
char* mystrdup(const char* c)
{
int size = strlength(c);
char* result = new char[size];
copy(c, c + size, result);
return result;
}