2016-10-24 6 views
1
#include<stdio.h> 
#include<malloc.h> 

int main() 
{ 
    char *string1; 
    int length; 

    scanf("%d", &length); 

    string1 = (char *)malloc(sizeof(char) * length); 


    printf("\n Enter the First String : "); 
    fgets(string1, length, stdin); 

    printf("\n The First String : %s ",string1); 

    free(string1);  

    return 0; 
} 

誰かが上記のコードを助けてくれますか?私は文字列と文字列の長さを入力として取得しようとしています。しかし、私は弦の長さだけを入力することができます。その後、文字列入力部分をスキップします。C - ダイナミックメモリ割り当て

これは私が取得しています出力されます:

sh-4.3$ main 
10 

Enter the First String : 
The First String : 
sh-4.3$ 
+3

「10 」と入力しましたか? 'fgets'はこれを' 'と読みます。 – mch

+0

ええ、これは起こっていることです。 'fgets'の代わりに' scanf'を使います。 – AhmadWabbi

+0

scanfの後に 'getchar();'を追加して、stdinに残した改行文字を破棄します。 – Lundin

答えて

1
  • あなたはそれを削除scanf に後getchar()を使用する必要がありますので、 標準入力バッファに残ります"10<enter>"<enter>または"\n"を入力した後。

  • さらに、malloc.hの代わりに#include <stdlib.h>を指定する必要があります。

  • You malloc 0文字ではありません.0ターミネーターが原因です。 string1 = malloc(length + 1);が仕事をする、キャストが必要とsizeof(char) ではありません改行など でSTDIN /キーボードからの読み込み最も単純な答えは単に「\ nを追加することで、常に1

+0

scanf()の後にgetchar()を追加しました。出来た。助けに時間を割いてくれてありがとう。 –

0

あなたは、文字列入力用のstdinを使用する必要がある場合は、fgetlnを使用することができます。私はあなたの例を編集し、今ではそのようになっています

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

int main() 
{ 
    char *string1; 
    size_t length; 

    //scanf("%d", &length); 

    //string1 = (char *)malloc(sizeof(char) * length); 


    printf("\n Enter the First String : "); 
    //fgets(string1, length, stdin); 
    string1 = fgetln(stdin, &length); 
    string1[length] = '\0'; 

    printf("\n The First String : %s ",string1); 

    free(string1); 

    return 0; 
} 

注:fgetlnはC文字列、あなたが最後にNULL文字を追加する必要がありません返します。

+3

'fgetln'は標準ではありません。代わりに 'fgets'を使用してください。 – Lundin

+0

質問の著者はコンパイラについて何も書いていませんでした。私はApple LLVMを使用しました。 –

+2

これは、使用されているシステムのことを言及せずにCタグが付けられているので、標準Cで答えようとするべきです。特に、標準の同等機能を持つ非標準関数を使用する理由はありません。 – Lundin

0

です「つまり、scanf関数へ:

scanf("%d\n", &length); 

は、問題を解決します;)

PS:scanfの

の他のすべてのセキュリティ/バッファオーバーフローの問題に注意してください
関連する問題