2012-08-25 184 views
0

我遇到轉換問題。我不能使用字符串在這個節目,所以我不得不使用char的 - 我得到的錯誤:不能將Const Char [21]轉換爲Char?

error C2664: 'printText' : cannot convert parameter 1 from 'const char [21]' to 'char' 
1>   There is no context in which this conversion is possible 

我試圖將其轉換爲一個常量指針:

void printText(const char* text[100] = "notextgiven"... 

,但它不「 t似乎有所幫助,給了我更多的錯誤。

我的計劃:

#include <iostream> 
using namespace std; 

void printText(char, char, int); 

int main(){ 
    printText("I hear and I forget.", "*", 15); 
} 

void printText(char text[100] = "notextgiven", char symbol = ' ', int repeat = 10){ 
    int temp = 0; 
    while(temp < repeat){ 
     cout << symbol; 
      temp++; 
    } 

    cout << text; 

    temp = 0; 
    while(temp < repeat){ 
     cout << symbol << endl; 
      temp++ 
    } 
} 
+0

此外,'「*」''應該是''*''而不是... – 2012-08-25 22:21:43

+0

你知道字符(字符)和字符串之間有什麼區別嗎? – jalf

+1

@Derp不要更新代碼來回答你的問題。保持原樣。如果其他人出現這個問題,並且發現代碼中沒有錯誤,但是看到你正在尋求幫助解決一些不存在的問題?他們會感到困惑。下次,請不要更改您的問題或您的代碼。您應該這樣做的唯一原因是爲了清晰起見。 – 0x499602D2

回答

5

這不是定義函數,你正在嘗試做

void printText(char text[100] = "notextgiven", char symbol = ' ', int repeat = 10) 

試試這個,而不是

void printText(const char* text, char symbol, int repeat) 

這應該讓你的程序編譯正確的方式。也改變這一行

printText("I hear and I forget.", "*", 15); 

printText("I hear and I forget.", '*', 15); 
           ^^ 

單引號用於單個字符變量,雙引號把它當作一個字符串。由於這是作業,因此您可能會被要求專門使用char*,但由於您一般使用C++,因此使用std::string

+0

我給該函數默認值。另外,作爲作業,我不能使用字符串。 – Derp

+0

在這種情況下,您通常在函數聲明而不是實現中指定它們。 – mathematician1975

+0

@Derp如果你想給函數默認值,那麼在函數聲明中給它們,而不是在函數定義中。 –

2

在你原有的功能,你第一次嘗試把整個字符串的單個字符內 - 這顯然是不可能的。然後,您嘗試了一種合理的解決方案,C++主要出於歷史原因而不允許這樣做。

更改printText

void printText(const char *, char, int); 

這是爲什麼需要?

  • 一個C字符串是一個數組char s;
  • 數組無法在C/C++中傳遞值(無特殊原因);
  • 數組的名稱衰減到指向其第一個元素的指針,並且如果有指向第一個元素的指針,則可以索引整個數組;

因此,當您將數組傳遞給C/C++函數時,您實際上會傳遞一個指向其第一個元素的指針;對於泛型數組,您還可以在單​​獨的參數中傳遞數組的大小(否則被調用函數不知道何時停止檢查數組),對於C字符串,它不是必需的,因爲按照慣例,它們會在第一個'\ 0「字符(空終止符)。

爲什麼const?因爲你的函數不需要修改你傳遞給它的字符串,所以你明確這個事實,並且允許你的調用者通過const字符串而不會產生編譯錯誤(理論上字符串文字是const字符串,因爲它們不能修改,但由於歷史原因,它們可以被隱式轉換爲char *)。


順便說一句,這不是天生禁止一大小的數組參數聲明的功能 - 但是,對於上述的兼容性問題,它無論如何解釋爲指針。由於必須在函數的聲明(=原型)中指定它們,而不是在其定義中指定它們,所以會出現錯誤和默認值。


最後,作爲其他注意到了,在你的函數調用

printText("I hear and I forget.", "*", 15); 

第二個參數是一個字符串(因爲你在雙引號吧),當它應該是一個簡單char(括在單引號)。


  1. IIRC它有事情做與B或BCPL或任何兼容性問題是,有沒有內在的原因,數組不能按值傳遞。
1

您嘗試將字符串傳遞給函數,根據設置它,只接受一個字符。

printText需要將其參數設置爲char*而不是char(即:作爲字符序列而不是單個字符)。

因此,而不是printText(char, char, int);您需要的前向聲明爲printText(char*, char*, int)

同樣函數簽名應該是:

void printText(char* text = "notextgiven", char* symbol = " ", int repeat = 10)

+0

當我添加指針值時,當我嘗試添加默認參數時出現錯誤。告訴我這是不相容的。 – Derp

+0

這應該很好,至少它對我來說(使用VC++)。也許這是一個編譯器的事情。確保將默認值添加到函數定義中,而不是添加到聲明中(所以函數體所在的位置)。 – s3rius

0

請注意,您在原來的標題描述的錯誤信息是不完全一樣的實際的錯誤信息。 (我冒昧地改變了這一點)。「[21]」最後是極其重要的。特別是「[]」符號表示一個數組。所以編譯器告訴你,你正在試圖從數組轉換成一個字符。由於數組可以包含多個字符,因此編譯器會抱怨它無法執行此操作,這應該很明顯。

有了這個解釋,讓我們看看如何修復你的代碼。有三條線所導致你的代碼問題:

功能聲明

void printText(char, char, int); 

功能調用

printText("I hear and I forget.", "*", 15); 

功能定義

void printText(char text[100] = "notextgiven", char symbol = ' ', int repeat = 10){ 
    //... 
} 

這些是創建自己的功能的三個要素,他們必須全部匹配!如果他們不這樣做,編譯器會抱怨。那麼我們分析一下這些部分。首先聲明:

void printText(char, char, int); 

在這裏,您聲明一個名爲「printText」功能,需要三個輸入(兩個字符和一個整數),也沒有輸出(「空隙」)。

現在看函數定義:

void printText(char text[100] = "notextgiven", char symbol = ' ', int repeat = 10){ 
    //... 
} 

定義一個名爲「printText」有三個輸入沒有輸出功能。但仔細看看。這個「printText」函數需要一個字符數組,一個字符和一個整數作爲其輸入。因爲這個輸入列表與聲明中的輸入列表不同,所以這實際上是一個完全不同的函數

我也想在這裏提到一個函數定義定義了該函數實際上做了什麼。這是「{」和「}」之間的代碼。另一方面,一個函數聲明只是聲明一個函數存在的某處,但沒有說明函數內發生了什麼。爲了滿足編譯器,我們需要兩個。 (從技術上講,鏈接器也是涉及到的,但是這個細節對於當前的問題並不重要。)

還有一件事:你的函數提供默認參數和「=」。我懷疑這不是你想要的。既然你剛剛開始,我強烈建議你刪除它們,因爲它們會使事情複雜化。當你更熟悉函數時,你可以瞭解默認參數。

最後,讓我們來看看在函數調用:

printText("I hear and I forget.", "*", 15); 

由於該行出現在main()函數,它告訴printText()函數來完成它的事。這一行還提供了printText()函數的輸入。請注意,這裏給出的輸入是兩個字符串(或字符數組)和一個整數。 (雙引號內的任何內容 - 「」 - 是一個字符串,它也相當於一個字符數組。)現在這與函數聲明描述的輸入列表不匹配,所以編譯器試圖轉換您輸入的類型列出。編譯器抱怨,因爲它不能這樣做。

我懷疑你實際上想把第三個參數改爲'*'。請注意單引號。這就是你如何用C++(和大多數其他編程語言)表示單個字符。

我希望這個解釋能幫助你理解你的代碼是怎麼回事。祝你好運,學習C++!

相關問題