簡體   English   中英

從“ char *”到“ char”的無效轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM