6

またはscanf()を使用せずに C で完全な文を作成する方法fgets()gets()

ユーザーからのコマンドラインをスキャンし、最初の単語に基づいてコマンドを認識したいと考えています。例: mkdir

そのため、ユーザーが「dir_name」という名前の新しいディレクトリを作成したいことを認識する必要があります。

私のコード:

int main(){
  char *ch=malloc(sizeof("50");
  while (strcmp(ch,"exit")!=0){
     scanf("%[^\n]",ch);
  } 

最初の文を入力してEnterキーを押した後にこのコードを実行すると、無限ループに陥りました。理由はわかりません。

4

3 に答える 3

12

あなたの問題はおそらくここにあります:

char *ch=malloc(sizeof("50");

まず、閉じ括弧が 1 つありません。しかし、これが実際のコードではなく、質問を投稿する際のタイプミスであると仮定すると、より深い問題があります。

"50"二重引用符内は文字列リテラルです。を文字列リテラルにsizeof()適用すると、文字列内の文字数が取得されますNUL。したがって、 では 3 文字分のスペースしか割り当てていませんch

入力しようとするとscanf()、3 文字の buffer の末尾を超えて書き込んでいますch。省略してsizeof()、単に次のように言います。

char* ch = malloc (50);

また、スキャン セットは先頭の空白をスキップ%[^\n]しません。最初scanf()は改行で停止し、バッファに残ります。ループ内の後続scanf()の呼び出しは、whileその改行文字に遭遇し、スキャン セットから除外されるため、忠実に停止します。したがって、ループ条件

while (strcmp (ch, "exit"))

true になることはなく、無限ループが発生します。scanf()この問題を回避するには、 の後に改行を使用します。

scanf ("%[^\n]%*c", ch);

%*c「文字を読み取ってから破棄する」という意味です。そのため、バッファに残っている を読み取り、\nどこにも保存しません。したがって、 nextscanf()はバッファの先頭で a に遭遇せず\n、プログラムは意図したとおりに動作します。

于 2013-08-31T10:27:43.400 に答える
1
#include<stdio.h>
int main()
{
    char  input_string[100];
    scanf("%[^\n]s",&input_string);
    printf("Hello ,world.\n");
    printf("%s",input_string);
    return 0;
}
于 2016-06-30T03:38:56.377 に答える