2013-12-10 201 views
-1

此腳本應輸出由用戶輸入到數組「store」中的數組值。我試圖將所有的char數組值存儲到字符串temp中。我收到第12行的錯誤:「[錯誤]從'char *'無效轉換爲'char'[-fpermissive]。」將不勝感激任何幫助!將數組作爲參數傳遞給函數

編輯:所以我修改了聲明,現在至少編譯了,但我在我的cmd上得到的答案全部混亂起來。這是爲什麼? cmd只能正確地關閉第一個字符串,但在空格之後,它會混亂起來。

#include <iostream> 
#include <cstdlib> 

using namespace std; 
void coutArray(char[], int); 
int main() 
{ 
    char store[50]; 

    cout << "enter text: " << endl; 
    cin >> store; 
    coutArray(store, 50); 

    system("pause"); 
    return 0; 

} 
void coutArray(char store[], int max) 
{ 
    string temp = ""; 
    int i = 0; 
    while (i < max) 
    { 
     temp += store[i]; 
     i++; 
    } 
    cout << temp << endl; 
} 

使用所有回答者輸入我終於得到了固定代碼:

#include <iostream> 
#include <cstdlib> 
#include <string> 

using namespace std; 
void coutArray(char[], int); 
int main() 
{ 
    char store[50] = {0}; 

    cout << "enter text: " << endl; 
    cin.getline(store, 50); 
    coutArray(store, 50); 

    system("pause"); 
    return 0; 

} 
void coutArray(char store[], int max) 
{ 
    string temp = ""; 
    int i = 0; 
    while (i < max && store[i]!=0) 
    { 
     temp += store[i]; 
     i++; 
    } 
    cout << temp << endl; 
} 

謝謝大家。我學到了很多!!!

+0

您的聲明只接受一個'char'後:'無效coutArray(焦炭, INT);'。首先解決它。 – juanchopanza

+0

我將如何解決它? – user3088723

回答

0

so I fixed the declaration and now at least it compiles, but the answer I get on my cmd is all jumbled up. Why is this so?

不知道你的意思是混亂起來。但是,因爲你沒有告訴我們你鍵入其很難知道它看起來像它的工作對我說:

> ./a.out 
enter text: 
Plop 
Plop�ȏU� 

注意,因爲我的輸入是長只有4個字符。這意味着數組中的很多字符仍然有未定義的(即隨機值)。這就是我看到垃圾的原因。爲了通過這個初始化數組有全部0個值。

char store[50] = {0}; 

即使bettern使用C++對象比把手更長的字符串。

std::string store; 
std::getline(std::cin, store); 

注意:按值傳遞數組並不是一個好主意。另一方面,它們已經衰減爲指針,因此不再像數組一樣行爲(它們的行爲就像指針的語義相似但不完全相同)。

如果您必須傳遞一個數組傳遞它通過引用。但我會使用一個C++容器並通過引用來傳遞它(它比使用C構造要安全得多)。看看std::string

+0

#include #include #include using namespace std; void coutArray(string [],int); int main() { \t string store [50] = {0}; \t \t cout <<「輸入文本:」<< endl; \t getline(cin,store); \t coutArray(store,50); \t \t system(「pause」); \t return 0; \t } void coutArray(string store [],int max) \t string temp =「」; \t int i = 0; \t while(i user3088723

+0

^對不起,我di上述修改,但現在我得到另一個錯誤:[錯誤]沒有匹配函數調用'getline(std :: istream&,std :: string [50])' – user3088723

+0

它的'std :: string store;'不'std :: string store [50] = {0};'該字符串是一個C++類型並初始化並自動調整大小。它還有一個名爲size()的方法,它可以告訴你當前有多少個字符,所以你不需要假設爲50. –

0

該函數的聲明是錯誤的。應該是無效的coutArray(char *,int); 看看Implicit Conversion規則,瞭解編譯器可以做什麼以及不能做什麼。

+0

replace void coutArray(char,int);用void coutArray(char *,int); –

+0

宣言沒問題。現在已經解決了前向聲明中的小錯字。 –

0

你的程序的問題是你可能輸入的字符數少於緩衝區的最大大小。然後,當您將最大尺寸作爲參數傳遞給coutArray時,您將char陣列中的未填充插槽指定爲temp。這些未填充的插槽可能包含任何內容,因爲您尚未填充到這一點。

你的程序仍然是正確的,但是這將是更好的辦法是使用read,讓你指定的字節數是可以進入的最小字節數:

std::cin.read(store, 50); 

更好的解決方案是使用std::string

std::string store; 
std::cin >> store; 

// or for the entire line 
std::getline(std::cin, store); 

它也遵循您coutArray應改爲:

void coutArray(std::string); 
// ... 
void coutArray(std::string str) 
{ 
    std::cout << str << std::endl; 
} 
0

看這樣子

template<typename T, size_t N> 
void MyMethod(T (&myArray)[N]) 
{ 
    //N is number of elements, myArray is the array 
    std::cout<<"array elements number = "<<N<<endl; 

    //put your code 
    string temp; 
    temp.resize(N+1);//this is for performance not to copy it each time you use += operator 
    int i = 0; 
    while (i < max) 
    { 
     temp += store[i]; 
     i++; 
    } 
    cout << temp << endl; 
} 
//call it like this 
char arr[] = "hello world"; 
MyMethod(arr); 
1

當你使用獲得的輸入 「CIN」 你的輸入自動爲0(NULL)結束。 您只需在while語句中添加一小段代碼即可。

,而不是這樣的:

while (i < max) 

使用本:

while (i < max && store[i]!=0) 

現在,當輸入字符串結束將停止,將無法打印數組中存在任何事先的垃圾。

爲了表明CIN並添加終止零,我初始化數組到46,並把一個斷點CIN

enter image description here

+0

@LokiAstari - 我在初始化char store [50]後編寫了以下代碼:\t for(int i = 0; i <50; i ++) \t \t store [i] = 46; 它仍然有效,所以我沒有錯! – OopsUser

+0

但是擴展while循環條件的想法是非常好的(即非常好的想法)。 –

+0

所有好的答案,但Loki's是最有意義的! – user3088723

相關問題