سؤال

دعنا نقول أنني أتوقع قائمة العناصر من المدخلات القياسية التي يتم فصلها شراء فواصل، مثل هذا:

 item1, item2, item3,...,itemn

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

item1,item2,item3,...,itemn

إذا كنت تستخدم scanf مثله:

scanf("%s,%s,%s,%s,...,%s", s1, s2, s3, s4,...,sn);

سوف تفشل عند عدم وجود مساحات بيضاء (اختبرها) لأنها ستشير إلى الإدخال بأكملها كسلسلة واحدة. فكيف يمكنني حل هذه المشكلة فقط مع وظائف مكتبة C القياسية C؟

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

المحلول

هل يمكن أن يكون لديك نظرة على strtok. وبعد اقرأ أولا الخط إلى مخزن مؤقت، ثم قم بتكاليف:

const int BUFFERSIZE = 32768;
char buffer[BUFFERSIZE];
fgets(buffer, sizeof(buffer), stdin);

const char* delimiters = " ,\n";
char* p = strtok(buffer, delimiters);
while (p != NULL)
{
  printf("%s\n", pch);
  p = strtok(NULL, delimiters);
}

ومع ذلك، مع strtok سوف تحتاج إلى أن تكون على علم القضايا المحتملة المتعلقة بالرائد.

نصائح أخرى

الجواب السريع ليس أبدا، استخدم SCANF لقراءة إدخال المستخدم. من المقصود لقراءة المدخلات المنسقة بدقة من الملفات، وحتى بعد ذلك ليست جيدة. على الأقل، يجب أن تقرأ الخطوط بأكملها ثم تحليلها مع SSCANF ()، والذي يمنحك بعض الفرص لتصحيح الأخطاء. في أحسن الأحوال، يجب أن تكتب وظائف التحليل الخاصة بك

إذا كنت تستخدم بالفعل C ++، فقم بالتحقيق في استخدام فئات سلسلة C ++ وتدفقها، وهي أكثر قوة وآمنة.

أعتقد أنه من الأفضل كتابة وظيفة التحليل الخاصة بك لهذا. ولكن إذا كنت لا تزال تفضل SCANF على الرغم من المزالق، فيمكنك القيام ببعض الحل البديل، فقط بديلا٪ S مع٪ [^، t r n].

المشكلة التي تطابق٪ s تسلسل الأحرف المساحة غير البيضاء، لذلك يبتلع فاصلة أيضا. لذلك إذا قمت باستبدال٪ s مع٪ [^، t r n] سيعمل نفس الشيء تقريبا (الفرق هو أن٪ s يستخدم isspace (3) لتتناسب مع أحرف الفضاء ولكن في هذه الحالة تقوم بتحديد أحرف الفضاء بشكل صريح المباراة وربما هذه القائمة ليست هي نفسها بالنسبة للمصورة).

يرجى ملاحظة، إذا كنت ترغب في السماح للمسافات قبل وفاصلة، فيجب عليك إضافة مساحة بيضاء إلى سلسلة التنسيق الخاصة بك. تنسيق سلسلة "٪ [^، t r n]،٪ [^، t r n] يطابق سلاسل مثل "مرحبا، العالم"، "مرحبا، العالم"، "مرحبا، العالم".

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