هل هناك وظيفة في C تفعل نفس raw_input في بيثون؟

StackOverflow https://stackoverflow.com/questions/2496857

  •  21-09-2019
  •  | 
  •  

سؤال

هل هناك وظيفة C تفعل الشيء نفسه raw_input في بيثون؟

#in Python::
x = raw_input("Message Here:")

كيف يمكنني كتابة شيء من هذا القبيل في ج؟

تحديث::

أقوم بهذا ، لكنني أحصل على خطأ ::

#include<stdio.h>
#include<string.h>
#include "stdlib.h"

typedef char * string;

int raw_input(string msg);
string s;
string *d;

main(){
raw_input("Hello, Enter Your Name: ");
d = &s;
printf("Your Name Is: %s", s);

}

int raw_input(string msg){
string name;
printf("%s", msg);
scanf("%s", &name);
*d = name;
return 0;
}

والخطأ هو أن البرنامج يعمل وطباعة MSG ، واتخذ نوع المستخدم بواسطة ScanF ، ولكن بعد ذلك يعلق ويخرج .. ؟؟

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

المحلول

يمكنك كتابة واحدة بسهولة تامة ، لكنك تريد أن تكون حذراً بشأن تدفقات المخزن المؤقت:

void raw_input(char *prompt, char *buffer, size_t length)
{
    printf("%s", prompt);
    fflush(stdout);
    fgets(buffer, length, stdin)
}

ثم استخدمه مثل هذا:

char x[MAX_INPUT_LENGTH];
raw_input("Message Here:", x, sizeof x);

قد ترغب في إضافة بعض التحقق من الأخطاء ، وهلم جرا.

نصائح أخرى

ال Posix.1-2008 المعيار يحدد الوظيفة الحصول على خط, ، والتي ستقوم بتخصيص الذاكرة ديناميكيًا لتوفير مساحة لخط من الطول التعسفي.

هذا له الفائدة gets كونه غير معرض للتفاض إلى المخزن المؤقت الثابت ، والفائدة على fgets من القدرة على التعامل مع خطوط من أي طول ، على حساب كونها DOS محتملة إذا كان طول الخط أطول من مساحة الكومة المتاحة.

قبل دعم POSIX 2008 ، كشفت GLIBC هذا كملحق GNU أيضًا.

char *input(const char *prompt, size_t *len) {
    char *line = NULL;
    if (prompt) {
        fputs(prompt, stdout);
        fflush(stdout);
    }
    getline(&line, len, stdin);
    return line;
}

تذكر أن free(line) بعد الانتهاء من ذلك.


لقراءة في المخزن المؤقت ذات الحجم الثابت ، استخدم fgets أو scanf("%*c") أو مشابه؛ يتيح لك ذلك تحديد عدد أقصى عدد من الأحرف للمسح الضوئي ، لمنع فائض المخزن المؤقت الثابت. (لا يوجد سبب للاستخدام على الإطلاق gets, ، إنه غير آمن!)

char line[1024] = "";
scanf("%1023s", line);      /* scan until whitespace or no more space */
scanf("%1023[^\n]", line);  /* scan until newline or no more space */
fgets(line, 1024, stdin);   /* scan including newline or no more space */

يستخدم printf لطباعة الموجه الخاص بك ، ثم استخدم fgets لقراءة الرد.

الإجابة المختارة تبدو معقدة بالنسبة لي.

أعتقد أن هذا أسهل قليلاً:

#include "stdio.h"

int main()
{
   char array[100];

   printf("Type here: ");
   gets(array);
   printf("You said: %s\n", array);

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