1. new的使用
如下的程序和执行结果, new动态分配给pcary的空间的大小为什么和分配的不同呢? 如第一次输入26个, c字符串应该是26+1个, 但是显示是26 第二次输入一个a, 但是显示是3个 第六次也是输入一个a, 但是显示的是4个 #include <iostream> #include <string> using namespace std; int main() { string str; size_t i = 0; int j = 0; cout << "Input: "; while(cin >> str) { char *pcary = new char[str.size()+1]; cout << "pcary " << pcary << endl; cout << "strlen(pcary) " << strlen(pcary) << endl; for(i = 0, j = 0; j != str.size(); i++, j++) { *(pcary+i) = str[j]; } cout << "pcary " << pcary << endl ; cout << "strlen(pcary) " << strlen(pcary) << endl; delete [] pcary; cout << "-------------------------------" << endl; cout << "Input: "; } return 0; } 执行结果为: Input: abcdefghigklmnopqrstuvwxyz pcary strlen(pcary) 0 pcary abcdefghigklmnopqrstuvwxyz strlen(pcary) 26 ------------------------------- Input: a pcary strlen(pcary) 0 pcary a! strlen(pcary) 3 ------------------------------- Input: ab pcary a! strlen(pcary) 3 pcary ab! strlen(pcary) 3 ------------------------------- Input: abc pcary ab! strlen(pcary) 3 pcary abc strlen(pcary) 3 ------------------------------- Input: abcd pcary abc strlen(pcary) 3 pcary abcd strlen(pcary) 4 ------------------------------- Input: a pcary abcd strlen(pcary) 4 pcary abcd strlen(pcary) 4 -------------------------------
strlen()返回的是字符串的长度,从开始到遇到'\0'为止, 而str赋值的时候只复制字符,没有赋值'\0',而且new后,没有用memset清为0.
所以两种解决方法
1) 多复制一位
for(i = 0, j = 0; j != str.size()+1; i++, j++)
{
*(pcary+i) = str[j];
}
2)使用memset
char *pcary = new char[str.size()+1];
memset(pcary, '\0', str.size()+1);
ps:memset的详细说明可以见收藏.