0
#include <stdio.h>

void read_string(char prompt[], char returned[], int MAX)
{
fputs(prompt, stdout);
fflush(stdin);
fgets(returned, MAX, stdin);
}

main()
{
    char string[0][10];

read_string("String you want to return ", string[0], sizeof string[0]); 

printf("The returned string is %s",string[0]);

fflush(stdin);
getchar();

}

このコードは、私が作成した (変更した) 演習からのもので、よく理解できないコード行を示しているだけです。ループ内でさまざまな文字列を返すと想定されているため、STRING [0] [100] を宣言しました。これは単なる例です。

さて、変数「文字列」がこの文字列 = 戻り値のような関数で取得されることを理解しています次に、キーボードから文字列を取得した後(fgets)、どのようにメイン()に戻りますか、つまり、実際に戻って暗黙的にこれを行うのですか? 返された = 文字列

また、コンパイラはコンパイル時にこのメッセージを表示します(ただし、実行時に実際には文字列が返されます)

[警告] 文字列定数から 'char*' への非推奨の変換 [-Wwrite-strings]

私は関数とその構造を学ぶのが初めてで、まだポインターを見たことはありませんが、これまで読んだことから、文字列を返すにはポインターが必要です。この問題を解決するためのガイダンスに非常に感謝しています。

ここでの主な質問は、 return を使用する必要なく文字列がどのように返されるかということです。つまり、文字列は「returned」という変数に保存されますが、どのようにしてそこから抜け出し、メインに戻るのでしょうか。

4

3 に答える 3

4
char string[0][10];

長さゼロの 2 次元配列を宣言します。C で長さゼロの配列を持つことは違法です。

6.7.5.2 配列宣言子

それらが式 (配列のサイズを指定する) を区切る場合、式は整数型を持つ必要があります。式が定数式の場合は、0 より大きい値を持つ必要があります。

(prompt, stdout);をすべきかわからない。

長さゼロを渡して、それに書き込もうとしています。


fflush(stdin)は C では未定義の動作であることに注意してください。

私の理解が正しければ、プロンプトに最初の文字列を表示し、別の文字列を読み取って返します。

#include<stdio.h>

void read_string(char prompt[], char returned[], int MAX)
{
fputs(prompt, stdout);
fgets(returned, MAX, stdin);
}

int main()
{
char string[10];

read_string("String you want to return ", string, sizeof string); 
printf("The returned string is %s",string);
getchar();

return 0;
}

fgets削除したいかもしれないバッファに改行を読み込むことに注意してください。

于 2012-12-20T00:05:25.130 に答える
1

C では、実際には配列を引数として関数に渡すことはできません。を呼び出すとread_string("String you want to return ", string[0], sizeof string[0]);、実際に起こることは、配列パラメーターread_stringエイリアス化されることです。if と when がread_string変更するpromptreturned、呼び出し元の最初または 2 番目の ( string[0]) 引数文字列も変更されることを意味します。これread_stringが呼び出し元に文字列を返す方法です。

たとえば、配列read_stringを変更しようとすると( のように)、 も変更しようとします。標準 C では、このような文字列リテラルを変更すると、未定義の動作が発生します。多くのコンパイラは、この種の文字列リテラルを読み取り専用メモリに配置し、これによりプログラムが中止されます。promptprompt[0] = 'X'"String you want to return "

サイズが 0 の配列は C ではサポートされていないため、この行char string[0][10];は無効であることに注意してください。char string[1][10];

于 2012-12-20T09:52:56.523 に答える
0

KingsIndian が指摘したように、あなたのコードにはさまざまな問題があると思います。(prompt, stdout);また、以前に使用された構文を見たこともありません。

返される文字列に関して。そうではありません。文字の配列を宣言してから、このポインターを function_read 文字列に渡します。これは、その結果をそのメモリ位置に書き込んでいます。

したがって、元の文字列(ヌルまたはガベージになる)は、ユーザー入力によって上書きされています:)

于 2012-12-20T00:17:14.940 に答える