如何在C++中使用字符串?

如何在C++中使用字符串?,c++,linux,C++,Linux,我需要在不事先知道有多少字符串的情况下读取一组字符串,并在读取时打印它们。所以我决定用while!FEOFTSIN作为EOF指示器。以下是我的代码: #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; int main(void) { char* str; std::cout<<"\nEnter strings:";

我需要在不事先知道有多少字符串的情况下读取一组字符串,并在读取时打印它们。所以我决定用while!FEOFTSIN作为EOF指示器。以下是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>

using namespace std;
int main(void)
{ 
    char* str; 
    std::cout<<"\nEnter strings:";
    while(!feof(stdin))
    {  
        std::cin>>str;
        std::cout<<"\nThe string you entered is"<<str;
    }
    return 0;
}
由于某种原因,上面的代码在我输入第一个字符串后表示分段错误。是否有人可以建议对此进行修复。

str是指向char的指针。当你尝试在那里写的时候,它不会指向任何有效的地方

尝试C++中的一些新形式,或者,更好的是,既然你正在编码C++,那么使用STD::String。

< P> STR是指向char的指针。当你尝试在那里写的时候,它不会指向任何有效的地方

尝试C++中的一些新形式,或者,更好的是,既然你正在编码C++,那么使用STD::String。

STR被声明为char *STR,这意味着它不是真正的字符串,只是指针,未初始化的BTW,并且不分配任何空间。这就是为什么它是塞格弗茨。由于你在C++中编程,你可以使用< /P>

std::string str;
它会起作用的。别忘了包括。

str被声明为char*str,这意味着它实际上不是一个字符串,只是指向它的一个指针,未初始化,并且没有为它分配任何空间。这就是为什么它是塞格弗茨。由于你在C++中编程,你可以使用< /P>
std::string str;
它会起作用的。别忘了包括在内

我们应该这样做


如果要执行此操作,则需要为正在读取的字符串分配一些内存

目前,您所拥有的只是堆栈上指向某个随机内存区域的指针,这意味着当您读取字符时,它们会在其他数据,甚至是不允许写入的内存上跺脚,从而导致segfault

尝试分配一些内存的问题是,在读取字符串之前,您不知道要分配多少内存。。。你可以说300个字符,看看是否足够。但如果不是这样的话,您也会遇到同样的数据损坏问题


最好使用C++ STD::string类型。

,您需要为正在读取的字符串分配一些内存。p> 目前,您所拥有的只是堆栈上指向某个随机内存区域的指针,这意味着当您读取字符时,它们会在其他数据,甚至是不允许写入的内存上跺脚,从而导致segfault

尝试分配一些内存的问题是,在读取字符串之前,您不知道要分配多少内存。。。你可以说300个字符,看看是否足够。但如果不是这样的话,您也会遇到同样的数据损坏问题


最好使用C++ STD::string类型。

< P>一个分割错误发生在应用程序试图访问它不允许的内存位置时。在您的例子中,问题是您正在解引用一个未初始化的指针:char*str

一种可能的解决方案是更改指向数组的指针,使其具有合适的大小

这样的事情可能就足够了:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>

using namespace std;
int main(void)
{ 
    char str[20]; 
    cout<<"\nEnter strings:";
    while(!feof(stdin))
    { 
       cin.width(20); //set a limit
       cin>>str;
       cout<<"\nThe string you entered is"<<str;
    }
    return 0;
}

当应用程序试图访问不允许的内存位置时,会发生分段错误。在您的例子中,问题是您正在解引用一个未初始化的指针:char*str

一种可能的解决方案是更改指向数组的指针,使其具有合适的大小

这样的事情可能就足够了:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>

using namespace std;
int main(void)
{ 
    char str[20]; 
    cout<<"\nEnter strings:";
    while(!feof(stdin))
    { 
       cin.width(20); //set a limit
       cin>>str;
       cout<<"\nThe string you entered is"<<str;
    }
    return 0;
}

这不是C,它是C++。你需要用C或C++来做吗?差别是巨大的!嗨,弗雷迪克,谢谢你的标签编辑!这不是C,它是C++。你需要用C或C++来做吗?差别是巨大的!嗨,弗雷迪克,谢谢你的标签编辑!与此同时,人们正在与让缓冲区溢出发生的坏程序员进行斗争。我建议使用getline函数。正如@wormsparty所说的,还有while!std::cin.eof不是读取流中所有内容的正确方法。@wormsparty是的,我一直在等待有人发布无处不在的getline版本,但没有人发布,奇怪的是……与此同时,人们正在与让缓冲区溢出发生的坏程序员进行斗争。我建议使用getline函数。正如@wormsparty所说的,还有while!std::cin.eof不是读取流中所有内容的正确方法。@wormsparty是的,我一直在等待有人发布无处不在的getline版本,但没有人发布,奇怪。。。