سؤال

عندما تجميعها scanf("%s", &var);, ، يرسل دول مجلس التعاون الخليجي تحذيرا:

warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[20]’

ومع ذلك عندما أراد scanf("%s", var);, ، لا يتم تطبيق تحذير. تقول كل من أجزاء التعليمات البرمجية والكتاب الذي أقرأه خصيصا لاستخدام أمبيرودا، ولكن حتى أنه لا يحدث في بعض الأمثلة.

سؤالي هو، هل يجب علي الاستمرار في استخدام Ampersand، حتى عندما لا يحدد الكتاب؟

هل كانت مفيدة؟

المحلول

من ما نشرته var هي صفيف شار. في هذه الحالة، لا تحتاج إلى Ampersand، فقط الاسم var سوف تقيم إلى (char *) حسب الحاجة.

تفاصيل:

يحتاج SCANF إلى مؤشر إلى المتغير الذي سيقوم بتخزين المدخلات. في حالة سلسلة، تحتاج إلى مؤشر إلى مجموعة من الأحرف في الذاكرة الكبيرة بما يكفي لتخزين أي سلسلة قراءة. عندما تعلن شيئا مثل char var[100], ، يمكنك جعل مساحة 100 charS مع Var [0] في إشارة إلى أول Char و Var [99] في إشارة إلى Char 100th. يتم تقييم اسم الصفيف بحد ذاته بنفس الشيء تماما &var[0], ، وهو مؤشر إلى الطابع الأول للتسلسل، بالضبط ما يلزمه SCANF. لذلك كل ما عليك القيام به هو scanf("%s", var);, ، ولكن كن على علم بذلك scanf لا يفرض قيود الحجم على سلاسل المدخلات، لذا إذا كان المستخدم مدخل سلسلة طول 101، فستحصل على تجاوز مخزن مؤقت، مما سيؤدي إلى وجود أخطاء أو، حتى أسوأ مشاكل أمنية. الاختيار الأفضل هو عموما fgets التي تسمح بقيود الحجم للحصول على سلاسل المدخلات.

نصائح أخرى

أدعو أي جواب آخرين لإعطاء ملخص جيد للمؤشرات والمراجع هنا. لا أعتقد أنني أستطيع أن أفعل ذلك دون إجراء بعض الأخطاء هنا وهناك، وليس لدي أي نية للتعامل مع الغضب الطالب الذي يذاكر كثيرا ما ستتبعه.

لذلك سوف أشرك فقط إلى الخير موارد لمعرفة المزيد عن المؤشرات والمراجع التي تكمن في قلب مشكلتك. http://www.cplusplus.com/Doc/Tutorial/Pointers/

مسح ال & من scanf("%s", &var); اذا هي كذلك scanf("%s", var);.

عند استخدام مجموعة مثل هذا واحد:

char name[20];

يجب أن تنظر في أن منطقة الذاكرة المؤلفة من 20 حرفا مرتبط بها. للحصول على عنوان بداية منطقة الذاكرة هذه، يجب عليك استخدام اسم الصفيف، مع الحصول على عنوان سحر واحد من مجموعة هذه الصفيف، يجب عليك استخدام Sintax مثل هذا: & name [i].
أنت تستخدم SCANF لقراءة سلسلة، وهي صفيف من Char in C. Scanf تتطلب عنوان منطقة الذاكرة المرتبطة بنوع المتغير للقراءة. في هذه الحالة، تقوم بقراءة مجموعة حتى يكون لديك فقط لاستخدام الاسم. إذا كنت ترغب في قراءة متغير واحد وليس صفيف، فعليك استخدام Ampersand. علي سبيل المثال:

char myChar;
scanf("%c", &myChar);

آمل أن يكون هذا مفيدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top