Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用指针输入字符串时出现问题_C++_String_Pointers - Fatal编程技术网

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]?当然还有其他问题。