[英]Invalid conversion from ‘char*’ to ‘char’
我的代碼在編譯后,將錯誤的invalid conversion from 'char*' to 'char'
,並確定倒數第二行, return char32
作為問題return char32
。 我已經搜索了Internet和該站點,但是沒有找到任何幫助。 我發現錯誤消失了,如果我用return *char32
替換問題行,則代碼可以編譯,但我不確定為什么會這樣。 我知道這是指針符號,但是我不確定它們如何應用於這種情況。 另外,當我這樣做並嘗試將*char32
打印到終端時,什么也沒有發生,表明*char32
為空。 我還驗證了確實從文件中讀取了一行some file
。
更新1:我試圖從parse()
返回完整的數組。
更新2:我意識到我沒有說明此代碼的目標。 我試圖從some file
讀取第一行,將其傳遞給parse()
,並將前32個字符索引到數組char32
,然后將其傳遞回main()
。 對困惑感到抱歉。
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
char parse(string line), char32[32];
int main()
{
string line;
ifstream vgv;
vgv.open("some file");
getline(vgv, line);
cout << char32;
return 0;
}
char parse(string line)
{
int size = line.size();
for (int count1 = 0; count1 < 32; count1 ++)
{
char32[count1] = line[count1];
}
return char32;
}
char32
的類型是char(*)[32](退化為char *) ,即32個chars的數組。 這是完全不同的char
是一個單個字符。 如果要返回整個數組,請更改返回類型。 否則,僅返回一個字符: char[x]
其中x是所需的索引。
編譯器告訴您錯誤。 您說解析返回一個字符。
char parse(....
char32是一個char數組; 字符數組的類型為char *。
所以當你走
return char32;
你與你先前說的相矛盾
解析返回什么-一個字符或一個字符數組? 選擇一個並保持一致
這里有很多問題。
如果您確實要返回單個字符,則應該
return char32[0];
或您想要的任何字符(按索引)。 順便說一下,這與* char32相同。 如果不使用索引,則可以將數組變量視為指向元素中第一個數組的指針。 盡管由於char32
是全局的,所以它實際上並沒有在返回void的函數上方添加任何值-調用者可以直接訪問char32
。 如果要使用cout
輸出結果,最好從parse
返回一個新string
。
你應該停止在循環parse
,當你到達分鍾(大小,32),否則你會溢出輸入字符串的line
與不確定的結果(壞的,通常情況下)。 最好在此處為空終止符留出空間-再次使用string可以避免這種情況。
魔術數字是邪惡的。 使用它代替硬編碼的32:
const size_t MAX_LENGTH(32);
如果所有解析都是按字節復制,則可以使用std::copy
但是我懷疑這是您打算在接口問題解決后構建的真正解析器的原型。 我認為您缺少對char myresult = parse(line);
的調用char myresult = parse(line);
在將char32
輸出到cout
之前。
您的函數返回char類型,但是Char32類型為char *。 從您要嘗試執行的操作來看,您想更改函數的返回類型。
我可以看到很多問題。 其中一些已經被其他人提及。
1) parse()
)的返回類型是char
,但是您返回的是char*
2)您的parse()
函數在myString.c_str();
是多余的myString.c_str();
將字符串表示為char數組或myString.copy(char32, 32);
該方法將字符串的前32個字符復制到數組中。 (請注意,最后一個字符將不是表示字符串末尾的空終止符'\\0'
)
3)您的代碼實際上從未將輸入的數據放入char32。 您會像這樣忘記main中的一行: char* char32 = parse(line);
總而言之,通過執行以下操作可以改進您的代碼:
int main()
{
string line;
ifstream vgv;
vgv.open("some file");
if(!vgv)
return 1; // failure
getline(vgv, line);
char* char32 = new char[32];
line.copy(char32,31);
char32[31] = '\0'; //Ensure that the string is actually terminated
cout << char32;
delete [] char32;
return 0; // success
}
我所呈現的主要問題是,如果行的數據少於31個字符,則在打印char32時會看到垃圾數據。 因此,最好將我的char32[31] = '\\0'
替換為以下內容:
int size = line.size();
char32[(size > 31) ? 31 : size] ='\0';
最后,如果您想在char32
找到數據的大小,可以執行以下操作:
int size = 0;
while(char32[size++] != '\0' && size < 32){} // gets size of the valid data within char32
-更新-
如果您真的想使用解析功能,這是我的最佳建議。
char* parse(string line, int quantity)
{
char* rtn = new char[quantity];
line.copy(rtn, quantity-1);
int size = line.size();
rtn[(size > quantity-1) ? quantity-1 : size] = '\0';
return rtn;
}
int main()
{
string line = "asdfsadfsdaf";
char* myDataOne = parse(line, 32);
char* myDataTwo = parse(line, 5);
cout << myDataOne << endl;
cout << myDataTwo << endl;
delete [] myDataOne;
delete [] myDataTwo;
return 0; // success
}
雖然我不清楚您要使用此代碼實現什么,但我將在語法上解決該問題。
char parse()
聲明為一個char
,即一個字符。 如果希望它返回一個字符數組,則應將返回值更改為char*
。 這樣,您就可以簡單地return char32;
。 否則,必須通過索引char32
從數組中選擇一個字符。 *char32
將等效於char32[0]
。
最后一點,在C ++中,您最好堅持使用std::string
而不是普通的char
數組或指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.