C++ 使用指针输入字符串时出现问题
我是初学者,我需要问一个问题。。 我写了一个小代码,从用户那里接受一个字符串并打印出来。非常简单C++ 使用指针输入字符串时出现问题,c++,string,pointers,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++)
#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;
}
当我输入任何字符串时..例如堆栈溢出..它将打印sta并删除字符串的其余部分。我知道这是一个很容易解决的问题,但由于我刚刚开始,我不明白这里出了什么问题。提前感谢。此代码有几个问题。首先,缓冲区溢出,因为char*p=new char[1]只为存储分配一个字符。当i>0时,超过此值。接下来,您的第一个循环将继续运行,直到它到达未分配内存未定义行为中的一个值为零的点。在您的例子中,这恰好在第三个值之后。您可能需要类似于*p+i-1==0的内容,以便在满足某些条件的情况下读取最后一个字符。最后,您正在使用new[]分配内存,而没有使用匹配的delete[]正确地解除分配内存 考虑使用std::cin和std::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;
}
这段代码有几个问题。首先,缓冲区溢出,因为char*p=new char[1]只为存储分配一个字符。当i>0时,超过此值。接下来,您的第一个循环将继续运行,直到它到达未分配内存未定义行为中的一个值为零的点。在您的例子中,这恰好在第三个值之后。您可能需要类似于*p+i-1==0的内容,以便在满足某些条件的情况下读取最后一个字符。最后,您正在使用new[]分配内存,而没有使用匹配的delete[]正确地解除分配内存 考虑使用std::cin和std::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;
}
你的程序做任何事情都只是运气;什么阻止*p+i从\0开始?在C++程序中使用GeChar和PutChar也是很奇怪的。这个程序背后的故事是什么?你的程序做任何事情都只是运气;什么阻止*p+i从\0开始?在C++程序中使用GeChar和PutChar也是很奇怪的。这个程序背后的故事是什么?您只为一个字符分配空间,但尝试在其中添加许多字符 这是家庭作业吗?如果是,请贴上标签。你可以使用STL吗 如果是这样,则在新字符[1]上使用std::vector 编辑:不需要任何精细的位或STL
const int MAX = 100;
char *p=new char[MAX];
for(i = 0 ; *(p+i) && i < MAX ; i++)
*(p+i) = getchar();
可能有些是一个接一个的-作为练习您只为一个字符分配空间,但您尝试在其中放置许多字符 这是家庭作业吗?如果是,请贴上标签。你可以使用STL吗 如果是这样,则在新字符[1]上使用std::vector 编辑:不需要任何精细的位或STL
const int MAX = 100;
char *p=new char[MAX];
for(i = 0 ; *(p+i) && i < MAX ; i++)
*(p+i) = getchar();
可能有些是一个接一个的-留作练习如果你读入内存,请确保分配足够的内存。new char[1]只创建一个包含一个char的数组,但您正在读取更多的char。一个简单的临时修复方法是简单地分配更多,比如说新字符[255] 其他说明: 您从未删除分配的内存:delete[]p;
您应该检查您是否读取了缓冲区所能容纳的尽可能多的字符:for..;&&如果你读入内存,一定要分配足够的内存。new char[1]只创建一个包含一个char的数组,但您正在读取更多的char。一个简单的临时修复方法是简单地分配更多,比如说新字符[255] 其他说明: 您从未删除分配的内存:delete[]p;
您应该检查您是否读取了缓冲区所能容纳的尽可能多的字符:for..;&&我这里有一些与您的思路类似的代码,它们似乎是有效的。我确信有更好、更多的C++风格的方法来实现这一点
#include <iostream>
using namespace std;
#define MAXLEN 80
int main()
{
int i=0;
char c;
char *p = new char[MAXLEN + 1]; // 1 char will not be sufficient
do // Doing this with a for loop would be unreadable
{
c = getchar();
*(p+i) = c;
i++;
} while( c != '\n' && i < MAXLEN ); // Check for a newline. How do you enter the zero with a keyboard?
*(p+i) = 0; // Ensure that the last character is zero
for(i = 0 ; *(p+i) ; i++) putchar(*(p+i)); // This is OK but difficult to read
delete [] p; // Don't forget this
return 0;
}
下面是一些与您的思路类似的代码。我确信有更好、更多的C++风格的方法来实现这一点
#include <iostream>
using namespace std;
#define MAXLEN 80
int main()
{
int i=0;
char c;
char *p = new char[MAXLEN + 1]; // 1 char will not be sufficient
do // Doing this with a for loop would be unreadable
{
c = getchar();
*(p+i) = c;
i++;
} while( c != '\n' && i < MAXLEN ); // Check for a newline. How do you enter the zero with a keyboard?
*(p+i) = 0; // Ensure that the last character is zero
for(i = 0 ; *(p+i) ; i++) putchar(*(p+i)); // This is OK but difficult to read
delete [] p; // Don't forget this
return 0;
}
如果p被分配为数组,它必须是delete[]p。如果p被分配为数组,它必须是delete[]p。我刚刚开始,所以我甚至没有接触STL或vectors或std::string。我试着用我所知道的使这段代码工作。马上学习std::string和STL。当你表面上试图学习C++时,没有理由强迫自己在C中编程。是的,不,你必须使用STL和String。同时,要成为一个优秀的C++程序员,你需要知道堆、指针等。这取决于你写的东西和为什么。您确实需要理解为什么这段代码会爆炸,修复它,然后丢弃它,然后用stl/stringWell重做。我刚刚开始,所以我甚至没有接触stl或vectors或std::string。我试着用我所知道的使这段代码工作。马上学习std::string和STL。当你表面上试图学习C++时,没有理由强迫自己在C中编程。是的,不,你必须使用STL和String。同时,要成为一个优秀的C++程序员,你需要知道堆、指针等。这取决于你写的东西和为什么。你确实需要联合国
了解为什么这段代码会爆炸,修复它,然后丢弃它,然后用stl/STRING重做。我不能称它为程序。。你可以说这是我写的一段代码,用来解释动态内存分配是如何工作的。好吧,在这种情况下,正如其他人所提到的,你没有分配足够的空间,而且你完成后也没有释放它。我不能称之为程序。。你可以说这是我写的一段代码,用来解释动态内存分配是如何工作的。好吧,在这种情况下,正如其他人所提到的,你没有分配足够的空间,而且在完成后也没有释放空间。如果这是家庭作业,可能是他的任务,不使用cout和cint如果这是家庭作业,这可能是他的任务不使用cout和cin。。。更好的方法,比如塞思·约翰逊的回答。你应该接受这个而不是这个。好的,如果可以的话,我可以接受你的两个答案。你们两个都提供了足够的信息。但由于我还没有学会std::string,所以我无法很好地判断。。。。更好的方法,比如塞思·约翰逊的回答。你应该接受这个而不是这个。好的,如果可以的话,我可以接受你的两个答案。你们两个都提供了足够的信息。但由于我还没有学会std::string,我无法很好地判断。为什么用*p+i代替p[i]?当然还有其他问题。为什么用*p+i代替p[i]?当然还有其他问题。