System.formatexception: سلسلة الإدخال لم تكن بالتنسيق الصحيح


يظهر هذا الرمز خطأ

ج#
System.FormatException: Input string was not in a correct format

ج#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello");
            Console.WriteLine("enter the character");
            int c = Console.Read();
            Console.WriteLine(c);

            Console.WriteLine("please enter first integer");
            int p1 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("second");
            int p2 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine(p1 + p2);
          
        }
    }
}

ولكن إذا قمت بتعليق الكود على النحو التالي فهو يعمل بشكل جيد:

ج#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //Console.WriteLine("hello");
            //Console.WriteLine("enter the character");
            //int c = Console.Read();
            //Console.WriteLine(c);

            Console.WriteLine("please enter first integer");
            int p1 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("second");
            int p2 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine(p1 + p2);
          
        }
    }
}

من فضلك قل لي السبب.
شكرًا

ما حاولت:

int p1 = Convert.ToInt32(Console.ReadLine().Trim());
ولكنه يظهر أيضًا نفس الخطأ.

الحل 1

أنت تقوم بإدخال حرف وقراءته كـ int. تلك هي المشكلة. صححها.

الحل 2

إنها ليست مشكلة في الكود. تكمن المشكلة في الإدخال الذي تحاول تغذية هذا السطر من التعليمات البرمجية. لا يمكن تحويل كل ما تكتبه على وحدة التحكم إلى عدد صحيح.

قد ترغب في البحث في Int32.TryParse() بدلاً من ذلك. اقرأ عنها في الوثائق أولاً.

الحل 3

بالإضافة إلى الحلين 1 و 2:

لا تستخدم الفصل Convert عندما لا تكون هناك حاجة إليها حقا. هذا ليس “تحويل”؛ هذا هو تفسير. من الأفضل استخدام الطريقة التي تفعل ذلك بالضبط، في حالتك، int.Parse، أو الأفضل، الطريقة التي لا ترمي الاستثناء، int.TryParse:

.

-سا

الحل 4

لقد قمت بنسخ الكود الخاص بك واختبرته.
على الرغم من أنني أدخل integer القيم كان يعطي نفسه format exception..
يعتبر الحل 1،2،3 للحصول على معلومات بخصوص تحليل القيم الصحيحة

المشكلة هي أنك تستخدم Console.Read() طريقة

يقتبس:

تمنع طريقة القراءة إرجاعها أثناء كتابة أحرف الإدخال؛ وينتهي عند الضغط على مفتاح Enter. يؤدي الضغط على Enter إلى إلحاق تسلسل إنهاء السطر المعتمد على النظام الأساسي بإدخالك (على سبيل المثال، يقوم Windows بإلحاق تسلسل تغذية سطر الإرجاع). تسترد الاستدعاءات اللاحقة لأسلوب القراءة إدخالك حرفًا واحدًا في كل مرة. بعد استرداد الحرف الأخير، تمنع القراءة عودته مرة أخرى وتتكرر الدورة.

يشير إلى وحدة التحكم. طريقة القراءة (النظام)[^]

حاول تصحيح هذا الكود أدناه

ج#
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello");
            Console.WriteLine("enter the character");
            int c = Console.Read();
            Console.WriteLine(c);

            Console.WriteLine("please enter first integer");
            string p1str = Console.ReadLine(); // this will be ignored if you use Console.Read()
            int p1 = Convert.ToInt32(p1str);
            Console.WriteLine("second");
            string p2str = Console.ReadLine();
            int p2 = Convert.ToInt32(p2str);
            Console.WriteLine(p1 + p2);

        }
    }

ال Console.Read() سيتم تعيين قيمة الحرف الأخيرة في هذا السطر.
والفوري Console.ReadLine() سيتم تجاهله من إدخال المستخدم ويقوم بتعيين القيمة المكتوبة بالفعل على الشاشة.
على سبيل المثال:
إذا كتبت “a1” ثم p1str سوف تحتفظ بالقيمة “1“بتجاهل الحرف الأول
إذا كتبت “123” ثم p1str سوف تحتفظ بالقيمة “23” والتي يمكن تحليلها إلى عدد صحيح دون استثناء.
إذا كتبت “1[pressed enter key]” ثم p1str سيحتفظ بالقيمة “” (مفتاح فارغ أو مفتاح إرجاع) مما سيؤدي إلى format exception..

أتمنى أن تكون قد فهمت، وقم بتطبيق نقطة التوقف ومصحح الأخطاء، وشاهد كيف يعمل..

الحل 5

Console.WriteLine("hello");
            Console.WriteLine("enter the character");
            int c = Console.Read();
            Console.WriteLine(c);
            Console.ReadLine(); //this work fine
            Console.WriteLine("please enter first integer");
            int p1 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("second");
            int p2 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine(p1 + p2);
        }

コメント

タイトルとURLをコピーしました