Segfault عند محاولة استخدام البيانات من Scanf؟

-1

إنني عالق بشدة بشأن ما يمكن أن يسبب هذه المشكلة ، وأود حقًا أن أفهم ما يحدث خلف الكواليس لحدوث ذلك. الغرض من الكود التالي هو الحصول على سلسلة بطول 99 حرفًا كحد أقصى ، ووضعها في متغير يسمى كلمة ، وقراءة الطول ؛ في وقت لاحق سأقوم بإعادة تخصيص الذاكرة المخصصة لها من خلال مقدار الأحرف داخل السلسلة ، ولكن الآن أريد فقط أن أكون قادرًا على الحصول على الإدخال. إليك مقطع الرمز:

char* word = malloc(100);
printf("Enter a string:\n");
int x = scanf("%s", &word);
printf("Length = %d", x);
printf("Word is %s", word);

عند الاستخدام ، يحدث هذا:

Enter a string:
123
1
Segmentation Fault

ماذا يحصل هنا؟ لماذا هذا لا يعمل؟ اعتقدت أن تخصيص الذاكرة مع malloc سيعطيها مساحة كافية ، ثم سيضع Scanf كلمتي في المتغير؟ أحتاج إلى استخدام malloc لأنني بحاجة إلى إعادة تخصيصه لاحقًا لعدم استخدام ذاكرة أكثر مما أحتاجه لاحقًا.

3 الاجابة

3
افضل جواب

في الكود الخاص بك

 int x = scanf("%s", &word);

يجب تغيير

 int x = scanf("%99s", word); //99 chars to be scanned - at max - see note below

مثل word هو بالفعل مؤشر إلى char ، التي

  • هو نوع الوسيطة المتوقع لـ %s
  • يشير إلى الذاكرة التي خصصتها للتو.

نقلا عن C11 ، الفصل §7.21.6.2 ، لـ fscanf() أسرة

s

[...] If no l length modifier is present, the corresponding argument shall be a pointer to the initial element of a character array large enough to accept the sequence and a terminating null character, which will be added automatically. [....]

ملاحظة : في حالة الشك / الارتباك ، تحقق دائمًا من أنواع البيانات.

  • word من النوع char * - النوع الصحيح والمتوقع
  • &word من النوع char ** . - نوع الخطأ

قال ذلك ، بعض النصائح

  • تحقق دائمًا من التنفيذ / الإرجاع الناجح لوظائف المكتبة. ( malloc() ، scanf() الخ) قبل استخدام النتيجة.
  • حدد حجم المسح دائمًا لمنع تجاوز سعة المخزن المؤقت من الإدخال الطويل للغاية.
:مؤلف
1
افضل جواب

تكمن المشكلة هنا: int x = scanf("%s", &word); . لا تستخدم & مع scanf عمياء. صحيح أنه يجب عليك تمرير العنوان إلى scanf ولكن هنا تمر عنوان word . المتغير word هو عنوان في حد ذاته (أو بالأحرى ، يحتوي على عنوان). تريد كتابة البيانات بدءًا من هذا العنوان.

ارمي & . استعمال int x = scanf("%s", word);

:مؤلف
0

المشكلة في هذا البيان int x = scanf("%s", &word) . لقد أعلنت char* word = malloc(100) وهو ما يعني أنه مصفوفة شخصية. يمكنك تعديل البيان إلى int x = scanf("%s", word) (بدون & ). تحقق من رمز المثال على https://www.tutorialspoint.com/c_standard_library/c_function_scanf.htm

يمر word يوفر العنوان نفسه للعنصر الأول من الصفيف لتخزين القيم المقروءة.

بعد قول هذا إذا كانت كمية الذاكرة التي تحتاجها معروفة بالفعل في وقت الترجمة ، فمن الأفضل تخصيص الذاكرة بشكل ثابت على النحو التالي:

char word[100]

لقراءة عدد محدد من الحروف استخدم التعبير scanf("%<count>s", <stringVariable> . في حالتك سيكون:

scanf("%99s", word)

كود المثال متاح هنا: https://en.wikipedia.org/wiki/Scanf_format_string

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام