我需要在不知道有多少字符串的情况下阅读一堆字符串并在阅读时打印它们。所以我决定使用while(!feof(stdin))
作为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;
}
上面的代码由于某种原因在我输入第一个字符串之后说segmentation fault
。有人建议修复它。
答案 0 :(得分:2)
您需要为正在阅读的字符串分配一些内存。
目前你所拥有的只是一个随机存储区的堆栈指针,这意味着当你读取字符时,它们将遍及其他数据,甚至是你不允许写入的内存 - 这会导致段错误。
尝试分配一些内存的问题是你不知道在读入字符串之前要分配多少...(你可以说“300个字符”并查看它是否足够。但如果它不是你有同样的数据损坏问题吗?
最好使用C ++ std::string
类型。
答案 1 :(得分:1)
str
是指向char
的指针。当你试图写在那里时,它并没有指向任何有效的地方。
在C ++中尝试某种形式的new
,或者更好的是,因为您正在编写C ++,请使用std::string
。
答案 2 :(得分:1)
str
被声明为char* str
,这意味着它实际上不是一个字符串(只是指向它的指针,未初始化的BTW),并且没有为它分配任何空间。这就是为什么它是seggfaults。由于您使用c ++编程,因此可以使用
std::string str;
它会起作用。不要忘记#include <string>
。
答案 3 :(得分:1)
当应用程序尝试访问不允许的内存位置时,会发生分段错误。在您的情况下,问题是您要取消引用未初始化的指针: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;
}
答案 4 :(得分:0)
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
int main(void)
{
std::string str[300];
std::cout<<"\nEnter strings:";
while(!std::cin.eof())
{
std::cin>>str;
std::cout<<"\nThe string you entered is"<<str;
}
return 0;
}
应该做的伎俩