2015-11-01 46 views
1

我已經寫了兩個函數,我將字符串矢量傳遞給一個特定的函數(PrintStringVector)來打印內容,並在第二個函數中傳遞要打印的指針數組內容。第一個功能工作正常,但第二個是給我的代碼下面的錯誤。將二維數組和向量作爲參數傳遞給函數

#include <cmath> 
#include <stdlib.h> 
#include <cstdio> 
#include <string> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 
int n; 

void PrintStringVector(vector<string> & v){ 


    for(int i=0;i<v.size();i++){ cout<<v[i]<<endl;} 

} 


void PrintStringArray(const char *arr[n]){ 

    for(int i=0;i<n;i++){ cout<<arr[i]<<endl;} 



} 

int main() { 

    vector<string> vec;      
    cin>>n; 
    const char *arr[n]; 

    for(int i=0;i<n;i++){ 
     string str; 
     cin>>str; 
     vec.push_back(str); 
     arr[i]=str.c_str(); 
    } 

    PrintStringVector(vec); 
    PrintStringArray(arr); 


    return 0; 
} 

ERRORS:

 [email protected]:~/Documents/hackerrank$ g++  passing_vector_of_string_or_passing_2d_array.cpp 
     passing_vector_of_string_or_passing_2d_array.cpp:17:35: error: expected ‘,’ or ‘...’ before ‘arr’ 
     void PrintStringArray(const char* arr[n]){ 
             ^
     passing_vector_of_string_or_passing_2d_array.cpp: In function ‘void PrintStringArray(const char*)’: 
     passing_vector_of_string_or_passing_2d_array.cpp:19:33: error: ‘arr’ was not declared in this scope 
     for(int i=0;i<n;i++){ cout<<arr[i]<<endl;} 
             ^
     passing_vector_of_string_or_passing_2d_array.cpp: In function ‘int main()’: 
     passing_vector_of_string_or_passing_2d_array.cpp:40:25: error: cannot convert ‘const char**’ to ‘const char*’ for argument ‘1’ to ‘void PrintStringArray(const char*)’ 
     PrintStringArray(arr); 
+0

與您的代碼的另一個問題是,你存儲的內存由管理的地址當y時,局部變量超出範圍'str' ou do'arr [i] = str.c_str();'這會導致未定義的行爲。 – pcarter

+0

因爲我沒有更好的解決方案將字符串str分配給字符指針。我認爲c_str()將C++字符串轉換爲c字符串(由char數組構成)。 – Bam

+0

'c_str()'返回一個C兼容的指針,但是這個指針只有在返回它的'std :: string'對象存在時纔有效。您在此之後使用它。 – pcarter

回答

2
const char *arr[n] 

這不是有效的聲明(除非n爲常量表達式)。 C++沒有可變長度數組。 「

」但它適用於main

這是因爲G ++實現的擴展,C++這個擴展似乎與C變量長度數組兼容的。不,一般是越野車。不要使用它。

「但是,我怎麼能有類似的功能? 「

使用std::vector。除非你知道你爲什麼需要這些低級原不使用指針,new[]delete[]非常好。

2

在C++中不能有VLA(可變長度數組)。由於只有在運行時才知道數組arr的大小,因此不能將其用作固定大小數組的大小。您應該使用new來分配它。例如。

const char **arr = new const char*[n]; 

而且修改函數簽名這樣

void PrintStringArray(const char *arr[]){ 

或類似這樣的

void PrintStringArray(const char **arr){ 

最後記得刪除arr一旦你完成它。

delete[] arr; 
+0

不可以。您不應該使用'new'來分配數組。 (你*可*,但*不應*)。你應該使用'std :: vector'。 –

相關問題