أدخل عددًا معينًا من الأحرف مع تضمين المسافات

1

ما أحاول تحقيقه هو عدم أخذ أكثر من حرف "x" (المسافات متضمنة) كمدخل. أنا أعرف فقط كيف أقوم بهما بشكل منفصل scanf ،

مثل ما يلي:

scanf("%20s",str)

لا يستغرق ذلك أكثر من 20 حرفًا.

scanf("%[^\n]s",str) يأخذ مسافات كذلك ، ولكن ليس له حدود. حاولت getline ولكنه يأخذ \n كقيمة في السلسلة أيضًا ، ولا أريد ذلك. آمل أن أكون واضحًا بما يكفي بشأن ما أطلبه.

مما أخبرنيchqrlie أنني كتبت هذا المقطع:

void getstring(char *str, int len)
{
    do
    {
        if (fgets(str, len, stdin))
        {
            fflush(stdin);
// if is not the first character to be the new line then change it to '\0' which is the end of the string.
            if (str[0] != '\n')
                str[strcspn(str, "\n")] = '\0';
        }
    }while (str[0] == '\n'); // Check if the user has inserted a new line as first character
}

2 الاجابة

2
افضل جواب

ليس لديها تنسيق الطابع الطبقات زائدة s ، مكتوب بهذه الطريقة:

scanf("%[^\n]", str)

إذا كنت ترغب في تحديد الحد الأقصى لعدد الأحرف المخزنة في الصفيف الوجهة ، فحدد هذا الرقم بين % و ال [ :

scanf("%20[^\n]", str)

لاحظ مع ذلك أن التحويل سيفشل و scanf() سيعود 0 إذا كان هناك سطر فارغ معلّق لمواصفات التحويل هذه.

من الخطأ الشائع حذف الاختبار على القيمة المرجعة لـ scanf() ، مما تسبب في سلوك غير محدد في حالة فشل التحويل بسبب ترك متغيرات الوجهة في حالتها السابقة (غير مهيأة في كثير من الحالات).

قد يكون أكثر فعالية للاستخدام fgets() وإزالة الخط الزائدة الجديد بهذه الطريقة:

if (fgets(s, 20, stdin)) {
    /* line was read, can be an empty line */
    s[strcspn(s, "\n")] = '\0';  /* remove the trailing newline if any */
    ...
} else {
    /* fgets() failed, either at end-of-file or because of I/O error */
    ...
}
:مؤلف
1
افضل جواب

يمكنك استخدام ما يلي:

for(i = 0; i < x; i++) 
{
    getchar(c);
    if(c == '\n') break;
    str[i] = c; 
}

ولكن يجب أن تكون على دراية بالخطوط الجديدة الموجودة في المخزن المؤقت. :)

:مؤلف
فوق
قائمة طعام