1

これまでのところ、私はこのコードを持っています:

char *str;
scanf ("%s", &str);
printf("%s",&str);
system("pause");

それは動作しますが、問題は、キーを押してプログラムを続行 (または終了) した後、次のエラーが表示されることです。

実行時チェックの失敗 #2 - 変数「str」の周りのスタックが壊れていました。

以前に char ポインターをいじったことがないので、このエラーが発生する理由と、ユーザーから文字列入力を受け取る形式を改善する方法について説明を求めたいと思います。これにはもっと簡単な方法があることは知っていますが、私の最終的な目標は、ユーザーを制限するのではなく、入力のサイズを決定するための最も単純なコードを取得することです。

前もって感謝します

4

5 に答える 5

6

質問の2番目の部分(事前に入力の長さを決定する)は、単純なscanfでは不可能です(より複雑になり、チャンクごとに読み取り/追加することを除く)。

しかし、少なくとも以下のコードは、ランダム メモリの上書きを修正します。

char buffer[256];
char *str= buffer;
scanf ("%s", str);  // or scanf ("%s", buffer);  or scanf("%s", &buffer[0]);
printf("%s", str);  // or printf("%s", buffer);  or printf("%s", &buffer[0]);
system("pause");

事前に非常に大きなバッファーを使用してから、結果を特定の長さにトリミングすることもできますが、最大が必要です。始める長さ。

char *str= (char *)calloc(1,10000);
scanf ("%.9999s", str);
str= (char *)realloc(str, strlen(str)+1);  // release excess memory 
printf("%s", str); 
free(str);
system("pause");
于 2013-06-04T17:05:25.580 に答える
1

"my ultimate goal is to get the simplest code to determine the size of the input, and not limit the user."

ええ、そこに問題があります。そうすると、物事はトリッキーになり始めます。そのような初期化されていないポインターを単純に使用して、必要な数の文字を取得することはできません。最も簡単なオプションは次のとおりです。

char *str = malloc(1000);
scanf ("%999s", str);

また

char str[1000];
scanf ("%999s", &str);

もちろん、これは入力量に制約を課します。(ところで、この条件を満たす数があるかどうかを実際に評価する必要があります。)

現在、他のオプションがありますが、それらはポータブルではなくなり始めています. GCC を使用している場合は、使用できる「動的な」指定子があります。

char *str;
scanf("%ms", str); // dynamically allocate space for the size of input from the user

しかし、これを使用すると、使用されているコンパイラに手を結び付けることができます (また、バージョン、これは c99 で機能し、以前のニーズ"%as")

それ以外に、入力を一度に 1 文字ずつ読み取り、それを自分で成長させた文字列に追加することができますが、これは OS 固有の解決策であり、*nix または windowoze の関数を使用する必要がありますncursesgetch()_kbhit()_getch();

于 2013-06-04T17:18:18.397 に答える