4

raw_inputPythonと同じことを行う C 関数はありますか?

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

そのようなものをCでどのように書くことができますか?

アップデート::

これを作成しますが、エラーが発生します::

#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;
}

エラーは、プログラムが実行されてメッセージが出力され、scanf によってユーザーの種類が取得されることですが、ハングして終了します.. ??

4

4 に答える 4

8

非常に簡単に記述できますが、バッファ オーバーフローに注意する必要があります。

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);

エラーチェックなどを追加したい場合があります。

于 2010-03-23T01:08:07.400 に答える
3

POSIX.1-2008標準では、関数getlineを指定しています。この関数は、メモリを動的に(再)割り当てて、任意の長さの行用のスペースを作成します。

これには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 */
于 2010-03-23T02:42:00.050 に答える
0

を使用printfしてプロンプトを印刷し、 を使用fgetsして返信を読みます。

于 2010-03-23T01:08:16.607 に答える