2 Soalan: Saya sedang cuba untuk menyelamatkan satu set integer dalam pelbagai int, dengan mendefinisikan semula rentetan kepada nombor, kemudian simpan dalam array

soalan dicipta di Wed, May 8, 2019 12:00 AM

Saya cuba untuk menukar teks input /nombor (rentetan), yang akan menyertakan sebarang aksara, tetapi saya mahu memisahkan nombor dari aksara dan menyimpannya ke dalam array integer, setelah ia ditukar dari rentetan.

Saya percaya masalahnya adalah di mana rentetan itu menukar kepada integer dengan menggunakan stoi(), tetapi saya tidak nampaknya dapat mengesan masalah tersebut.

Pada masa ini, kod tersebut menerima apa-apa input dan mengubahnya menjadi rentetan, rentetan kemudian ditandakan watak oleh aksara, dan semua nombor tanpa pemisahan dengan koma atau ruang ditambah bersama, sekali koma atau ruang, atau mana-mana aksara lain memisahkan nombor, nombor secara keseluruhan ditambah pada array, dan kemudian terus memeriksa rentetan untuk lebih banyak nombor.

Apa-apa idea? Input Contoh1: 12, 13, 15     Contoh Input2: 12 13 15         Input Contoh3: 12ab13cd15ef

Keputusan dalam pelbagai integer: 0 [12] 1 [13] 2 [15] Nombor-nombor ini akan digunakan dalam urutan tertentu, dengan menggunakan nombor dalam array.

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

int main()
{
    string datainput, str1, str3;
    cin >> datainput;
    int n = 0, raycount = 0, c;
    int myray[10];
    while (datainput[n])
    {
        if (datainput[n] == ('0') || datainput[n] == ('1') || datainput[n] == ('2') || datainput[n] == ('3') || datainput[n] == ('4') ||
            datainput[n] == ('5') || datainput[n] == ('6') || datainput[n] == ('7') || datainput[n] == ('8') || datainput[n] == ('9'))
        {
            str1 = datainput[n];
            str3 += str1;
        }
        else
        {
            c= stoi(str3);
            c >> myray[raycount];
            raycount++;
        }
        n++;
    }
    cout << myray[0] << endl;
    cout << myray[1] << endl;
    cout << myray[2] << endl;
    cout << myray[3] << endl;
    system("pause");
    return 0;
}
    
0
2 Jawapan                              2                         

Saya melihat beberapa masalah dengan kod anda.

  • Sebelum C ++ 11, while (datainput[n]) mempunyai tingkahlaku yang tidak ditentukan sekali n mencapai akhir rentetan.

  • Cara anda mengecek digit berangka boleh dipermudahkan dengan menggunakan std::isdigit(), atau sekadar pemeriksaan jarak sederhana menggunakan operator >= dan <=.

  • Anda tidak menyumbang dengan betul untuk nombor-nombor yang dipisahkan oleh aksara-aksara lain, atau apabila nombor terakhir dalam rentetan berada di penghujung rentetan.

  • Pernyataan c >> myray[raycount]; perlu diubah kepada myray[raycount] = c;. Dan anda tidak melanggar gelung anda jika raycount mencapai kapasiti maksimum myray[].

  • Anda tidak menetapkan semula str3 kembali ke rentetan kosong setelah menukarnya dengan std::stoi(). Anda hanya menyimpan memasukkan digit baru pada akhir digit sebelumnya tanpa istirahat di antara angka.

Dengan itu berkata, cuba sesuatu yang lebih seperti ini:

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

int main()
{
    string datainput, str3;
    cin >> datainput;

    int myray[10];
    int raycount = 0;

    bool gettingDigits = false;

    for (int n = 0; n < datainput.size(); ++n)
    {
        char ch = datainput[n];

        //if (isdigit(ch))
        if (ch >= '0' && ch <= '9')
        {
            if (!gettingDigits)
            {
                str3 = "";
                gettingDigits = true;
            }

            str3 += ch;
        }
        else
        {
            if (gettingDigits)
            {
                myray[raycount] = stoi(str3);
                raycount++;
                str3 = "";
                gettingDigits = false;
                if (raycount == 10) break;
            }
        }
    }

    if (gettingDigits && (raycount < 10))
    {
        myray[raycount] = stoi(str3);
        raycount++;
    }

    for (int n = 0; n < raycount; ++n)
        cout << myray[n] << endl;

    system("pause");
    return 0;
}

Live Demo

Secara alternatif:

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

int main()
{
    string datainput, str3;
    cin >> datainput;

    int myray[10];
    int raycount = 0;

    string::size_type start = datainput.find_first_of("0123456789");
    string::size_type end;

    while (start != string::npos)
    {
        end = datainput.find_first_not_of("0123456789", start+1);
        if (end == string::npos)
        {
            str3 = datainput.substr(start);
            myray[raycount] = stoi(str3);
            raycount++;
            break;
        }

        str3 = datainput.substr(start, end-start);
        myray[raycount] = stoi(str3);
        raycount++;
        if (raycount == 10) break;

        start = datainput.find_first_of("0123456789", end+1);
    }

    for (int n = 0; n < raycount; ++n)
        cout << myray[n] << endl;

    system("pause");
    return 0;
}

Live Demo

    
0
2019-05-08 21: 43: 34Z
  1. Terima kasih atas input anda! Saya telah menerapkan beberapa perubahan yang anda cadangkan, dan ia adalah langkah ke arah yang betul. Juga sangat menghargai kaedah lain yang akan membuat kod lebih mudah. Menetapkan semula rentetan dan integer seolah-olah menetapkan masalah menyusun, tetapi saya masih tersangkut untuk mendapatkan semua nombor disusun ke dalam array, dan penukaran rentetan kepada nombor. Saya akan menyemak imbas kod yang anda hantar dan lihat apakah saya dapat menyelesaikan masalah saya. : -)
    2019-05-08 20: 06: 06Z
  2. @ Daniel akan membantu jika anda akan mengubah soalan anda untuk menunjukkan input sebenar yang anda taipkan, dan hasil yang diharapkan.
    2019-05-08 20: 09: 37Z
  3. Saya telah menambah 3 contoh, yang sepatutnya menghasilkan hasil yang sama.
    2019-05-08 20: 39: 55Z
  4. @ Daniel Saya mengemas kini jawapan saya. Terdapat ralat dalam contoh pertama saya, yang telah saya tetapkan.
    2019-05-08 21: 38: 44Z

Jadi, anda mahu memisahkan nombor dan aksara ke dalam array yang berbeza. Sekiranya blok, anda sedang menyemak aksara, maka saya mengesyaki stoi () tidak akan berfungsi. Betulkan typecast yang lebih baik ke integer.

int temp[10];

if (datainput[n] == ('0') || ...) {
            temp[n] = int(datainput[n]);
        }

Ini way temp array anda akan mengandungi nombor.

    
- 1
2019-05-08 16: 34: 59Z
  1. Saya akan berterima kasih jika anda memberitahu saya mengapa jawapan ini turun? Terima kasih.
    2019-05-13 08: 34: 19Z
sumber diletakkan di sini