私は文字列入力を取得し、その文字列を出力として取り消す関数を作成する必要がある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理由、です。私はそれを一方的に、あるいは別の方法で流さなければならないかもしれない。
'gets'は推奨されていません。 'fgets'を使うか、長すぎる入力があなたのバッファーをオーバーランさせ、未定義の動作を引き起こす可能性があるという警告メッセージを無視してください。 –
_'gets(answer) 'は' printf( "文字列をタイプ:") 'から入力を捕まえることがありますそれはどういう意味ですか?より具体的になりますか?多分あなたは[mcve]で別の特定の質問をするべきでしょう。 –
'gets()'は使わないでください。安全に使うことはできません。 [なぜ 'gets()'がとても危険なのか](http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not-be-used)を参照してください。 –