2014-02-15 63 views
2

我是C++的新手,我試圖編寫一個簡單的字符串反向程序。當我編譯它時,一切正常,但是當我運行它時,出現以下錯誤:C++給我basic_string :: _ S_construct null在我運行我的程序後無效錯誤

terminate called after throwing an instance of 'std::logic_error' 
    what(): basic_string::_S_construct null not valid 
Aborted (core dumped) 

我在做什麼錯?這是我的代碼。

#include <iostream> 
using namespace std; 

string reverse_string(char* argv[], int i); 

int main(int argc, char* argv[]) 
{ 
    for (int i = 0; i < argc; i++) 
    { 
     cout << reverse_string(argv, i) << endl; 
    } 
    return 0; 
} 

string reverse_string(char* argv[], int i) 
{ 
    string arg = argv[i + 1]; 
    string output; 
    int length = arg.length(); 
    for (int index = 1; index <= length; index++) 
    { 
     output += arg[length-index]; 
    } 
    return output; 
} 
+1

您分配一個nullptr字符串這是無效的,最有可能的是'的argv [I + 1]'。看到它[live](http://coliru.stacked-crooked.com/a/6abd8a3807f8a528)。 –

+0

這個錯誤是因爲你試圖在某個時候從一個空的char *構造'std :: string'。 – juanchopanza

+0

'argv [argc]'發生在你最後一次迭代時,是一個空指針。 – chris

回答

4

此:argv[i + 1]在顛倒字符串的建設應argv[i]和主迴路應for (i=1; i<argc; ++i)

而且還有更簡單的方法來扭轉串:

std::string reverse_string(char* argv[], int i) 
{ 
    std::string arg = argv[i]; 
    return std::string(arg.rbegin(), arg.rend()); 
} 
+1

好的,我已經注意到了。並感謝更簡單的方法:)。 – JadedTuna

1

好的謝謝大家的幫助!我只是不想顛倒參數0,這是程序的名字。但我找到了另一種方式。如果有人有興趣,這裏是固定的代碼:

#include <iostream> 
using namespace std; 

string reverse_string(char* argv[], int i); 

int main(int argc, char* argv[]) 
{ 
    for (int i = 1; i < argc; i++) 
    { 
     cout << argv[i] << " -> " << reverse_string(argv, i) << endl; 
    } 
    return 0; 
} 

string reverse_string(char* argv[], int i) 
{ 
    string arg = argv[i]; 
    string output; 
    int length = arg.length(); 
    for (int index = 1; index <= length; index++) 
    { 
     output += arg[length-index]; 
    } 
    return output; 
} 
+0

請看我的帖子。 –

2

此錯誤消息

terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid

表示您試圖調用std :: string的構造函數作爲參數指針NULL傳遞。問題是*(argv + argc)是NULL指針。

還要考慮到,你必須包括頭<string>

至於反函數,那麼可以寫簡單得多那麼你。首先,它只能有一個const char *

類型的參數,例如

#include <iostream> 
#include <string> 

std::string reverse_string(const char* s); 

int main(int argc, char* argv[]) 
{ 
    for (int i = 1; i < argc; i++) 
    { 
     std::cout << argv[i] << " -> " << reverse_string(argv[i]) << std::endl; 
    } 
    return 0; 
} 

std::string reverse_string(const char* s) 
{ 
    std::string arg(s); 
    return std::string(arg.rbegin(), arg.rend()); 
} 
+0

注意:'argv + argc'不能是空指針,因爲'argv [argc]'保證是空指針。 – chris

+0

@chris這是一個錯字。應該是*(argv + argc) –

+0

是的,我已經理解了。關於'const char * s',我仍然在學習:)。所以這就是爲什麼我不使用'const char *' – JadedTuna

相關問題