2016-09-22 39 views
0

私は文字列入力を取得し、その文字列を出力として取り消す関数を作成する必要があるC言語の学校プロジェクトを行っています。私はscanf("%s", answer);を使うことができましたが、これは文字列の最初の単語だけを格納します。そこで私はgets(answer)に行くことに決めました。私はそれがanswerに特定のメモリサイズを割り当てていないので、これは安全ではありません知っているが、配列を定義するとき、私は出回っこれをしなかった:char answer[100];はC言語で警告メッセージを受け取ります

教師はCygwinを使用してコンパイルし、これますので、私はfgetsを使用することに興味がありません警告は通常、Macを使用している端末でのみ表示されます。

warning: this program uses gets(), which is unsafe. 

文字列を入力するように指示する直前に端末に表示されます。私が持っているもう一つの問題は、gets(answer)は時々それの上のprintf("Type a string: ")からの入力をキャッチすることです。これを避ける方法はありますか?

ソースコード:

コードを実行
#include <stdio.h> 
#include <string.h> 

void reverseString(); 

int main() { 

    char str[100]; 

    printf("Type your string here: "); 
    gets(str); /* Catching return from prinf so add one extra */ 
    gets(str); 

    reverseString(str); 
} 

void reverseString(char string[]) { 

    char temp; 
    int startChar = 0; 
    int endChar = strlen(string) - 1; 

    while (startChar < endChar) { 
     temp = string[startChar]; 
     string[startChar] = string[endChar]; 
     string[endChar] = temp; 
     startChar++; 
     endChar--; 
    } 
    printf("\nReverse string is: %s\n", string); 
} 

warning: this program uses gets(), which is unsafe. 
Type your string here: hello world 

Reverse string is: dlrow olleh 

EDIT: だから私はfgets(str, sizeof(str), stdin)を使用してみましたが、それはまだ、ユーザ入力部をスキップします。私はすべてstrのバッファサイズを#define BUFFER_SIZE 100のように定義し、それを配列char str[BUFFER_SIZE]に追加しました。

EDIT:それはstdinから\nをキャッチするためfgets(str, sizeof(str), stdin)が機能しない理由 apaerant理由、です。私はそれを一方的に、あるいは別の方法で流さなければならないかもしれない。

+4

'gets'は推奨されていません。 'fgets'を使うか、長すぎる入力があなたのバッファーをオーバーランさせ、未定義の動作を引き起こす可能性があるという警告メッセージを無視してください。 –

+0

_'gets(answer) 'は' printf( "文字列をタイプ:") 'から入力を捕まえることがありますそれはどういう意味ですか?より具体的になりますか?多分あなたは[mcve]で別の特定の質問をするべきでしょう。 –

+1

'gets()'は使わないでください。安全に使うことはできません。 [なぜ 'gets()'がとても危険なのか](http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not-be-used)を参照してください。 –

答えて

-2

私が理解するように、文字列をスペースで読み込む方法を教えてください。しかし、あなたが私が従わなかった何らかの理由のためにfgets()を使いたくないのです。これを行う別の方法があります。

scanf ("%[^\n]%*c", str); 
+0

あなたはそれに従っていたはずです。ここで 'scanf'を使って何をしようとしているのか、その行は間違っています。 – Olaf

+0

1) 'name'は宣言されておらず、あまり定義されていません。 2)その行は 'fgets'よりどのように安全ですか? 3)警告が出された理由を研究していれば、あなたは知っているでしょう! – Olaf

関連する問題