0
program Test

implicit none
character (LEN=100) :: input
character (LEN=100) :: output
print *,"Please input your message: "
read *, input

すべての文字について、Ceaser's Cipher で暗号化します

計算

print *,"This is the output: "
write (*,"(2a)") "Message = ", out

end program Test

これは完全には機能しません。

入力のすべての文字について、modulo(iachar()) 関数を使用して変換します。印刷まで機能し、デバッグに従いました。暗号化は問題ありません。しかし、出力の問題は LEN=100 にあります。do ループは 100 回実行され、存在しない文字をゴミに変換し、出力時に UNDEFINED TYPE でプログラムを中断します。

したがって、「test」と入力すると、CBNC*GARBAGE-TO-100* が暗号化されて出力されません。長さを 4 と定義して実行すると、機能します。長さを定義せずにできるようにしたいです。これを回避する方法はありますか?

4

3 に答える 3

1

read ステートメントはinput、「ガベージ」を追加するのではなく、変数の全長 (100 文字) まで空白で埋める必要があります。LEN_TRIM 組み込み関数は、変数の値の有意な長さ (末尾の空白を除く長さ) を提供します。出力文字列を印刷するときのために、入力文字列のこの重要な長さを覚えておく必要がある場合があります。

(リスト指示入力の規則 (read ステートメントの * で示される) は少し驚くかもしれません。必要な動作によっては、"(A)" の形式の方がより堅牢な場合があります。)

入力を読み取るコンテキストで固定長の文字列を回避するという点では、Fortran 2003 では据え置き長文字が導入されており、これはここで非常に役立ちます。それ以外の場合は、Fortran 95 の可能性について、不明な長さの文字列の読み取りを参照してください。複雑なことの 1 つは、コンソールから読み取っているため、バックスペース ステートメントが機能しない可能性があることです。その回避策は、リンクされたものと同様のアプローチに従いますが、入力レコード長が決定されると同時に、入力文字列を文字の割り当て可能な配列に区分的に構築する必要があります。次に、シーケンスの関連付けを使用して、その配列を適切な長さのスカラーに変換します。詳細が必要な場合は、コメントするか、もう一度質問してください。

于 2013-02-15T02:09:52.603 に答える
0

標準の Fortran 文字列は固定長で、右側に空白が埋め込まれます。入力文字列の末尾に空白がない場合、解決策は簡単です。Fortran 組み込み関数len_trimを使用して、文字列の空白以外の長さを見つけ、それらの文字のみを処理します。別のアプローチは、新しい機能である割り当て可能な文字列を使用することです...これにより、可変長の文字列が提供されます。文字列の末尾の空白を許可しない場合は、使用するlen_trim方が簡単であることがわかるでしょう。

于 2013-02-15T01:49:30.943 に答える