使用指针输入字符串的一些问题

raf*_*ael 1 c++ string pointers

我是初学者,我需要问一个问题..我写了这个小代码,接受用户的字符串并打印出来.非常简单.

#include <iostream>

using namespace std;

int main()
{
   int i;
   char *p = new char[1];

   for(i = 0 ; *(p+i) ; i++) 
     *(p+i) = getchar();

   *(p+i) = 0;

   for(i = 0 ; *(p+i) ; i++) 
     putchar(*(p+i));

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我输入任何字符串...例如"堆栈溢出"例如..它将打印"sta"并删除其余的字符串.我知道这很容易解决但是因为我刚刚开始我无法理解这里有什么问题.提前致谢 .

Set*_*son 5

这段代码有几个问题.首先,您有一个缓冲区溢出,因为char *p = new char[1]只分配一个字符用于存储.这超过了i > 0.接下来,您的第一个循环将继续运行,直到它到达未分配的内存(未定义的行为)中具有零值的点.这恰好发生在您案例中的第三个值之后.你可能想要的东西更像是*(p+i-1) == 0"最后一个字符读取符合某些条件".最后,你正在分配内存new[]而不是用匹配来正确地释放它delete[].

考虑使用std::cinstd::string更安全和正确的代码:

#include <iostream>
#include <string>

int main(int, char**) {
   std::string s;

   std::cout << "Enter a string: ";
   std::cin >> s;

   std::cout << s << std::endl;
}
Run Code Online (Sandbox Code Playgroud)