2 سؤال: أحاول حاليًا حفظ مجموعة من الأعداد الصحيحة في صفيف int ، عن طريق إعادة تعريف السلسلة إلى أرقام ، ثم تخزينها في الصفيف

السؤال الذي تم إنشاؤه في Wed, May 8, 2019 12:00 AM

أحاول تحويل نص /أرقام الإدخال (سلسلة) ، والتي ستشمل أي أحرف ، لكنني أريد فصل الأرقام عن الأحرف وتخزينها في صفيف صحيح ، بمجرد تحويلها من سلسلة. P>

أعتقد أن المشكلة تكمن في تحويل السلسلة إلى عدد صحيح باستخدام stoi() ، لكن لا يمكنني تحديد المشكلة على ما يبدو.

حاليًا ، يقبل الرمز أي إدخال ويحوله إلى سلسلة ، ثم يتم فحص السلسلة حرفًا بحرف ، وتتم إضافة جميع الأرقام بدون فاصل مع فاصلة أو مسافة معًا ، بمجرد فاصلة أو مسافة ، أو أي حرف آخر يفصل الرقم ، ويضاف الرقم ككل إلى الصفيف ، ثم يستمر في التحقق من السلسلة لمزيد من الأرقام.

أي أفكار؟ مثال المدخلات 1: 12 ، 13 ، 15     مثال المدخلات: 12 13 15         مثال للمدخلات 3: 12ab13cd15ef

النتيجة في صفيف صحيح: 0 [12] 1 [13] 2 [15] سيتم استخدام هذه الأرقام بالترتيب المحدد ، باستخدام الأرقام الموجودة في الصفيف.

#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 إجابة                              2                         

أرى عددًا قليلاً من المشكلات في شفرتك.

  • قبل الإصدار C ++ 11 ، يحتوي while (datainput[n]) على سلوك غير محدد بمجرد وصول n إلى نهاية السلسلة.

  • يمكن تبسيط طريقة التحقق من الأرقام الرقمية إلى حد كبير باستخدام std::isdigit() ، أو حتى مجرد فحص مدى بسيط باستخدام مشغلي >= و <=.

  • أنت لا تُحاسب بشكل صحيح على الأرقام التي تكون مفصولة بأحرف أخرى ، أو عندما يكون الرقم الأخير في السلسلة في نهاية السلسلة.

  • يجب تغيير العبارة c >> myray[raycount]; إلى myray[raycount] = c; بدلاً من ذلك. ولن تقوم بتكسير حلقة إذا وصل raycount إلى أقصى سعة myray[].

  • أنت لا تعيد ضبط str3 مرة أخرى إلى سلسلة فارغة بعد تحويلها باستخدام std::stoi().

مع ذلك ، جرب شيئًا أكثر من هذا القبيل بدلاً من ذلك:

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

العرض التوضيحي المباشر

وبدلا من ذلك:

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

العرض التوضيحي المباشر

    
0
2019-05-08 21: 43: 34Z
  1. شكرًا على مدخلاتك! لقد طبقت بعض التغييرات التي اقترحتها ، وهي خطوات في الاتجاه الصحيح. نقدر أيضًا الأساليب الأخرى التي ستجعل الكود أسهل. يبدو أن إعادة ضبط السلاسل والأعداد الصحيحة تعمل على حل مشكلة التراص ، لكنني ما زلت عالقًا في الحصول على جميع الأرقام المتراكبة في الصفيف وتحويل السلسلة إلى رقم. سوف أتصفح الكود الذي نشرته ومعرفة ما إذا كان يمكنني حل مشكلتي. : -)
    2019-05-08 20: 06: 06Z
    لى>
  2. @ Daniel سيكون من المفيد إذا قمت بتعديل سؤالك لإظهار المدخلات الفعلية التي تكتبها ، وما يجب أن تبدو عليه النتيجة المتوقعة.
    2019-05-08 20: 09: 37Z
    لى>
  3. أضفت 3 أمثلة ، والتي يجب أن تنتج نفس النتيجة.
    2019-05-08 20: 39: 55Z
    لى>
  4. @ دانيال ، قمت بتحديث جوابي. حدث خطأ في المثال الأول الذي قمت بإصلاحه.
    2019-05-08 21: 38: 44Z
    لى>

لذا ، فأنت تريد فصل الأرقام والحروف في مصفوفات مختلفة. في حالة الحظر ، أنت تبحث عن أحرف ، لذلك ، أعتقد أن stoi () لن يعمل. من الأفضل طباعته على عدد صحيح.

int temp[10];

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

هذا واy سيحتوي مصفوفة temp على الأرقام.

    
- 1
2019-05-08 16: 34: 59Z
  1. سأكون ممتنًا إذا أخبرتني لماذا انخفض هذا الجواب؟ شكرا.
    2019-05-13 08: 34: 19Z
    لى>
وضع مصدر هنا