2016-06-24 8 views
0

文字列に文字数を定義することで問題があります。 は、例えば、私は、次のコードを持っている:文字列の文字数を数える

IDENTIFICATION DIVISION. 
PROGRAM-ID. TASK1. 
DATA DIVISION. 
FILE SECTION. 
WORKING-STORAGE SECTION. 
01 SOURCE-STRING PIC X(50) VALUE " The length of string ". 
01 LATTER-COUNTER PIC 99. 
PROCEDURE DIVISION. 
MAIN-PROCEDURE. 
    MOVE 0 TO LATTER-COUNTER 
    INSPECT SOURCE-STRING TALLYING LATTER-COUNTER FOR [???] 
STOP RUN. 

私はSOURCE-STRING(値で書かれている文字列「文字列の長さ」)の長さを見つけるために何を記述する必要があります。 長さは26文字(先頭スペース= 2、最終スペース= 4を含む)でなければなりません。

+1

COBOLには「文字列」はありません。そのフィールドには28個の末尾ブランクがあり、28個はすべて同じです。あなたは何をする必要があるのか​​、なぜそれを明確にする必要があります。あなたの質問の下にある編集リンクを使って情報を追加してください。 'MOVE'は予約語なので、' INSPECT'の真ん中にそれを置くだけで、何か役に立つものがあると期待することはできません。 –

+0

'MOVE'は間違いでしたが、私はコードを修正しました –

+0

@ sky_diver89提供された答えの1つはあなたのために働きますか?はいの場合:答えとしてマークしてください。答えが見つからない場合はコメントしてください[評判のためにコメントが機能しない場合は編集してください]。 –

答えて

3

として、ビルは言った:

COBOLは、 "文字列" を持っていません。そのフィールドには28個の末尾ブランクがあり、28個はすべて同じです。

あなたが使用末尾のスペースの数ではなく、フィールド内の末尾のスペース、その後でないMOVE何かを(あるいはそのためのVALUEを使用)などの長さを知っているが、例えば(フィールドを初期化したい場合MOVE ALL 'x00' TO FIELD)とSTRINGを使用してデータを取得してください(このようにして、 "C"文字列)。これにより、INSPECT ... BEFORE FIRST x'00'を行うことができます。考慮すべき

その他のオプション:

  • FUNCTION LENGTH (content)
  • STRING content INTO ... WITH POINTER LATTER-COUNTER(1で開始する必要があります)

、あなたの質問に(編集経由)より多くの情報を追加するときに私たちは、より良い答えを与えることができます(どのCOBOLコンパイラを使用するかを含む)。

+0

後続のバイナリゼロを確実に保持するには、フィールドを1バイト長くする必要があります。 –

+0

実際の例では複雑になりましたが、末尾の空白を減らすようなカウントされた長さを取得するだけです(これらすべてがここに示すリテラル値を基準にして複雑です)。 'FUNCTION STORED-CHAR-LENGTH(field)'です。だからこれは答えではなく、似ているが厳しい要件を持っていない人にはコメント/ヒントにすぎません。 –

0

あなたができることは、文字列の最後を示すためにNULLを使用しています。

まず、NULLSOURCE-STRINGを初期化します。

01 SOURCE-STRING PIC X(50) VALUE NULL. 

その後、代わりにSTRINGステートメントを使用し、あなたの変数にあなたの文字列を移動するMOVEを使用する:

STRING " The length of string " INTO SOURCE-STRING 

最初の26の文字が移動されていますSOURCE-STRINGに変換されますが、残りの文字は無傷のまま残り、文字列の末尾にはNULLバイトが残っています。次に、NULLバイトの開始位置を特定できます。

また、あなたは自動的に文字をカウントするPOINTERSTRINGを使用することができます移動:

WORKING-STORAGE SECTION. 

01 SOURCE-STRING PIC X(50) VALUE NULL. 
01 STR-PTR PIC 9(3). 

PROCEDURE DIVISION. 

    MOVE 1 TO STR-PTR 
    STRING " The length of string " 
    INTO SOURCE-STRING 
    POINTER STR-PTR 
    SUBTRACT 1 FROM STR-PTR 

STR-PTRは、実際の文字列の長さが含まれています。 は、STRINGコマンドを使用する前に明示的に1に設定する必要があります。

+0

'VALUE NULL'(私はあなたがテスト済みだと思います)はAcuCOBOLエクステンションでなければなりません。 AcuCOBOLには多くのものがあります:-)。 VALUE LOW-VALUESは、それを実行するための移動可能な方法です(照合順序を並べ替える人がいないという前提で)。なぜSTR-PTRに移動してから後で1を送りますか?なぜゼロを動かさないで...リテラルであれば(z-リテラルはリテラルにバイナリのゼロを追加します)、それ以外の場合は常に1バイト以上の長さにする必要があります。 –

+0

ACUCOBOL-GTでは、 'POINTER'の値として' ZERO'を使用すると、何らかの形で動作しません。[一般規則#4](https://supportline.microfocus.com/documentation/acucorpproducts/docs/ v6_online_doc/gtman3/gt36138.htm)を参照してください。他のランタイムの詳細はわかりませんが、ACUCOBOLにしかアクセスできません。しかし実際には、 'LOW-VALUES'は値をNULLバイトに設定するでしょう。私はX'0 'を使うこともできます。 –

+0

あなたはPOINTERについて正しいです。データの次の使用可能な位置です。したがって、ゼロより大きく、フィールドの長さよりも小さくなければなりません。すべてのオペレーティングシステムが "NULL"値を持つわけではありません。標準では、COBOLはアドレスである可能性のあるものに対してのみNULLを持ちます。 16進リテラルを使用する場合は、それ以外の場合はスペースパディングを使用する必要があります。リテラルの長さを取得するには、それが本当にタスクであればFUNCTION LENGTHが最適です。コンパイル時に評価されます。 –

関連する問題