Saya menerima kesalahan dari kode berikut ketika saya mencoba mengalokasikan array secara dinamis (terlihat setelah upaya saya untuk menambah setiap huruf dalam array pengguna menggunakan fungsi bool). Ini adalah kesalahannya:

main.cpp: In function ‘Word* splitSentene(std::string, int&)’:
main.cpp:81:32: error: cannot convert ‘std::string* {aka std::basic_string*}’ to ‘Word*’ in assignment
         words = new string[i];

Saya mencoba menghitung berapa banyak kata yang dimasukkan pengguna dan secara dinamis mengalokasikan array untuk string kata. Ini adalah kode saya sejauh ini:

#include <iostream>
#include <cctype>
#include <string>
using namespace std; 

struct Word 
{
    string english;     // English sentence 
    string piglatin;    // Pig latin sentence 
};

// PT 1. Function prototype 
Word * splitSentence(const string words, int &size){};



int main()
{
    string userSentence;
    int size; 
    
    // Get the users sentence to convert to pig latin 
    cout << "Please enter a string to convert to pig latin:\n";
    getline(cin, userSentence);

    // Directs to Word * splitSentence function 
    Word* tempptr = splitSentence(userSentence, size);
    delete [] tempptr;


    return 0;   
}

//PT 1. Analyze the sentence 
Word * splitSentene(const string words, int &size)
{
    bool flag = true;
    int num = 0;
    
    for (int i = 0; i < words.length() + 1; i++)
    {
        //test for white space, then when you hit the first alphabetical character after a space,
        //increment up the size of the array 
        if (isspace(words[i])) 
        
            flag = true;
            
        if (isalpha(words[i]));
        {
            if (flag == true)
            {
                flag = false;
                cout << words[i++];
            }
        }
        // Dynamically allocate the array for the words  
        Word *sentence = nullptr;
        sentence = new string[i];
    }


}

Berikut adalah petunjuk pt 1 untuk klarifikasi lebih lanjut:

PT. 1) Tulis fungsi yang menggunakan kalimat bahasa Inggris sebagai satu string. Fungsi ini pertama-tama harus menghitung berapa banyak "kata" dalam kalimat (kata-kata menjadi substring dipisahkan oleh spasi). Kemudian harus mengalokasikan array dinamis dengan ukuran yang sama dengan jumlah kata. Array berisi struktur Word (yaitu array tipe Word). Fungsi tersebut kemudian akan menyimpan setiap kata dari kalimat itu ke bidang bahasa Inggris dari struktur yang sesuai. Fungsi kemudian harus mengembalikan larik ini ke fungsi pemanggil menggunakan pernyataan kembali, bersama dengan ukuran larik menggunakan parameter referensi.

Fungsi ini juga harus menghapus semua huruf besar dan karakter khusus selain huruf. Implementasikan fungsi dengan prototipe berikut:

Word * splitSentence(const string words, int &size);

Ini adalah posting pertama saya di sini, jadi saya akan menghargai masukan apa pun tentang cara mengalokasikan array secara dinamis dan memformatnya (jika saya berhasil mengkodekan cara menghitung kata dalam kalimat yang dimasukkan pengguna). Jika informasi lebih lanjut perlu diberikan, beri tahu saya!

c++
0
Gcode 9 Juli 2020, 01:00

1 menjawab

Jawaban Terbaik

Kesalahan kompilator adalah karena Anda mencoba menetapkan larik string[] ke pointer Word*. Anda perlu mengalokasikan array Word[] sebagai gantinya.

Anda juga memiliki kesalahan lain dalam kode Anda:

  • Anda memiliki {} yang salah di akhir deklarasi splitSentence().

  • Anda salah mengeja splitSentene dalam definisi splitSentence().

  • Anda memiliki ; yang salah pada if (isalpha(words[i]));

  • Anda tidak return'ing array yang Anda alokasikan.

Bahkan, Anda bahkan tidak mengikuti instruksi dengan benar sama sekali. Anda tidak "menghitung berapa banyak kata dalam kalimat" SEBELUM mengalokasikan array (Anda mencoba, tetapi Anda melakukan alokasi di tempat yang salah), dan Anda tidak mengisi array sama sekali, apalagi "menghapus semua huruf besar dan karakter khusus selain huruf".

Coba sesuatu yang lebih seperti ini:

#include <iostream>
#include <cctype>
#include <string>
using namespace std; 

struct Word 
{
    string english;     // English sentence 
    string piglatin;    // Pig latin sentence 
};

// PT 1. Function prototype 
Word* splitSentence(const string words, int &size);

int main()
{
    string userSentence;
    int size; 
    
    // Get the users sentence to convert to pig latin 
    cout << "Please enter a string to convert to pig latin:\n";
    getline(cin, userSentence);

    // Directs to Word * splitSentence function 
    Word* tempptr = splitSentence(userSentence, size);
    delete [] tempptr;

    return 0;   
}

//PT 1. Analyze the sentence 
Word* splitSentence(const string words, int &size)
{
    bool flag = true;
    int num = 0;
    char ch;
    
    for (int i = 0; i < words.length(); ++i)
    {
        ch = words[i];

        if (isalpha(ch))
        {
            if (flag)
            {
                flag = false;
                ++num;
            }
        }
        else if (isspace(ch))
        {
            flag = true;
        }
    }

    Word *sentence = new Word[num];
    int index = -1;

    flag = true;
    num = 0;
    
    for (int i = 0; i < words.length(); ++i)
    {
        ch = words[i];

        if (isalpha(ch))
        {
            if (flag)
            {
                flag = false;
                ++num;
                ++index;
            }

            if (isupper(ch))
            {
                ch = tolower(ch);
            }

            sentence[index].english += ch;
        }
        else if (isspace(ch))
        {
            flag = true;
        }
    }

    size = num;
    return sentence;
}

Demo Langsung


Meskipun demikian, ini akan jauh lebih mudah untuk mengimplementasikan splitSentence() jika Anda dapat menggunakan std::istringstream dan std::vector dan idiom C++ lainnya, daripada menggunakan idiom C, misalnya:

#include <iostream>
#include <sstream>
#include <cctype>
#include <string>
#include <vector>
#include <algorithm>
using namespace std; 
     
struct Word 
{
    string english;     // English sentence 
    string piglatin;    // Pig latin sentence 
};
     
// PT 1. Function prototype 
Word* splitSentence(const string words, int &size);
     
int main()
{
    string userSentence;
    int size; 
     
    // Get the users sentence to convert to pig latin 
    cout << "Please enter a string to convert to pig latin:\n";
    getline(cin, userSentence);
     
    // Directs to Word * splitSentence function 
    Word* tempptr = splitSentence(userSentence, size);
    delete [] tempptr;

    return 0;   
}
     
//PT 1. Analyze the sentence 
Word* splitSentence(const string words, int &size)
{
    istringstream iss(words);
    vector<string> vec;
    string s;
     
    while (iss >> s)
    {
        remove_if(s.begin(), s.end(),
            [](unsigned char ch){ return !isalpha(ch); });

        if (!s.empty())
        {
            transform(s.begin(), s.end(), s.begin(),
                [](unsigned char ch){ return tolower(ch); });

            vec.push_back(s);
        }
    }
     
    Word *sentence = new Word[vec.size()];
     
    transform(vec.begin(), vec.end(), sentence,
        [](const string &s){
            Word w;
            w.english = s;
            return w;
        }
    );
     
    size = vec.size();
    return sentence;
}

Demo Langsung

0
Remy Lebeau 8 Juli 2020, 23:03