2011-09-08 48 views
1

我需要在不知道事先知道的情況下讀入一串字符串,並在讀取它們時打印它們。所以我決定使用while(!feof(stdin))作爲EOF indicator.Here是我的代碼:如何讀取C++中的一串字符串?

#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後,我進入第一string.Can有人建議應該是一個修正。

+1

這不是c,它是C++。你需要用c或C++來完成嗎?差異是巨大的! –

+0

您好fredik感謝標籤編輯! – station

回答

2

您需要分配你正在閱讀進入串一些內存。

你現在所有的東西都是堆棧上的一個指向隨機存儲器區域的指針,這意味着當你讀取字符時,它們會踩踏其他數據,甚至是你不允許寫入的內存 - 這會導致段錯誤。

試圖分配一些內存的問題是,你不知道要分配多少,直到字符串被讀入...(你可以說「300個字符」,看看它是否足夠,但如果它是不是你有同樣的問題數據損壞)

更好地使用C++ std::string類型。

1

str是指向char的指針。當你試圖寫在那裏時,它並沒有指向任何有效的地方。

在C++中嘗試某種形式的new,或者,更好的是,由於您正在編寫C++,因此請使用std::string

1

str被聲明爲char* str,這意味着它不是一個真正的字符串(只是一個指向它的指針,未初始化的BTW),並沒有爲它分配任何空間。這就是爲什麼它seggfaults。既然你用C++編程,你可以使用

std::string str; 

它會工作。別忘了#include <string>

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; 
} 

應該做的伎倆

+0

與此同時,人們正在努力讓糟糕的程序員讓緩衝區溢出發生。我建議'getline'函數。 – wormsparty

+0

@wormsparty說了什麼,while(!std :: cin.eof())不是從流中讀取所有東西的正確方法。 –

+0

@ wormsparty是的,我正在等待有人發佈無處不在的'getline'版本,但沒有人,奇怪... –

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; 
} 
相關問題