2 Tôi hiện đang cố gắng lưu một bộ số nguyên trong một mảng int, bằng cách xác định lại chuỗi thành số, sau đó lưu trữ nó trong mảng

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đang cố gắng chuyển đổi văn bản /số (chuỗi) đầu vào, sẽ bao gồm bất kỳ ký tự nào, nhưng tôi muốn tách các số khỏi các ký tự và lưu trữ chúng thành một mảng số nguyên, khi nó được chuyển đổi từ một chuỗi.

Tôi tin rằng vấn đề là chuỗi chuyển đổi thành số nguyên bằng cách sử dụng stoi(), nhưng dường như tôi không thể phát hiện ra vấn đề.

Hiện tại, mã chấp nhận bất kỳ đầu vào nào và biến nó thành một chuỗi, sau đó chuỗi được kiểm tra theo từng ký tự và tất cả các số không phân tách bằng dấu phẩy hoặc dấu cách được thêm vào với nhau, một khi dấu phẩy hoặc dấu cách hoặc bất kỳ ký tự nào khác tách số, toàn bộ số được thêm vào mảng và sau đó tiếp tục kiểm tra chuỗi để biết thêm số.

Có ý tưởng nào không? Ví dụ đầu vào1: 12, 13, 15     Ví dụ đầu vào2: 12 13 15         Ví dụ đầu vào3: 12ab13cd15ef

Kết quả trong mảng số nguyên: 0 [12] 1 [13] 2 [15] Những số này sẽ được sử dụng theo thứ tự cụ thể, bằng cách sử dụng các số trong mảng.

#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 Câu trả lời                              2                         

Tôi thấy khá nhiều vấn đề với mã của bạn.

  • Trước C ++ 11, while (datainput[n]) hành vi không xác định một lần n đến cuối chuỗi.

  • Cách bạn kiểm tra các chữ số có thể được đơn giản hóa rất nhiều bằng cách sử dụng std::isdigit() hoặc thậm chí chỉ là kiểm tra phạm vi đơn giản bằng cách sử dụng toán tử >=<=.

  • Bạn không hạch toán chính xác các số được phân tách bằng các ký tự khác hoặc khi số cuối cùng trong chuỗi nằm ở cuối chuỗi.

  • Thay vào đó, câu lệnh c >> myray[raycount]; cần được thay đổi thành myray[raycount] = c;. Và bạn sẽ không phá vỡ vòng lặp của mình nếu raycount đạt công suất tối đa myray[].

  • Bạn không đặt lại str3 trở lại chuỗi trống sau khi chuyển đổi nó bằng std::stoi(). Bạn chỉ cần nối các chữ số mới vào cuối các chữ số trước mà không bị ngắt giữa các số.

Thay vào đó, hãy thử một cái gì đó giống như thế này:

#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;
}

Bản trình diễn trực tiếp

Ngoài ra:

#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;
}

Bản trình diễn trực tiếp

    
0
2019-05-08 21: 43: 34Z
  1. Cảm ơn bạn đã đóng góp! Tôi đã áp dụng một số thay đổi mà bạn đề xuất và đó là các bước đi đúng hướng. Cũng đánh giá cao các phương pháp khác sẽ làm cho mã dễ dàng hơn. Đặt lại các chuỗi và số nguyên dường như khắc phục vấn đề xếp chồng, nhưng tôi vẫn bị mắc kẹt trong việc lấy tất cả các số được xếp chồng vào mảng và chuyển đổi chuỗi thành một số. Tôi sẽ duyệt qua mã bạn đã đăng và xem liệu tôi có thể giải quyết vấn đề của mình không. : -)
    2019-05-08 20: 06: 06Z
  2. @ Daniel sẽ hữu ích nếu bạn chỉnh sửa câu hỏi của mình để hiển thị đầu vào thực tế bạn đang nhập và kết quả mong đợi sẽ như thế nào.
    2019-05-08 20: 09: 37Z
  3. Tôi đã thêm 3 ví dụ, sẽ tạo ra kết quả tương tự.
    2019-05-08 20: 39: 55Z
  4. @ Daniel Tôi đã cập nhật câu trả lời của mình. Có một lỗi trong ví dụ đầu tiên của tôi, mà tôi đã sửa.
    2019-05-08 21: 38: 44Z

Vì vậy, bạn muốn tách các số và ký tự thành các mảng khác nhau. Trong khối nếu bạn đang kiểm tra các ký tự, vì vậy, tôi nghi ngờ stoi () sẽ không hoạt động. Tốt hơn là đánh máy nó thành một số nguyên.

int temp[10];

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

wa nàyy mảng tạm thời của bạn sẽ chứa các số.

    
- 1
2019-05-08 16: 34: 59Z
  1. Tôi sẽ rất biết ơn nếu bạn cho tôi biết lý do tại sao câu trả lời này bị từ chối? Cảm ơn.
    2019-05-13 08: 34: 19Z
nguồn đặt đây