accept文でコンソールからの入力を受け付け、通常は20文字を受け付けるが、EXITの4文字が入力された時にはstop runが実行される、という
プログラムを作りたいのですが、EXITの4文字を入力後、残り16文字分の無駄打ちをさせずに済ませる方法はないでしょうか?

A 回答 (3件)

acceptする変数側をpic x(20)で定義していれば、最大20文字の文字列で受け取れませんか?


(無条件に20回acceptする仕組みにしているため、残りの回数分を考慮しなくてはならないだけでは??)

最大文字列以下の文字数で入力が終わるなら、入力完了のキーが何かしらあると思いますけど。
(ENTERキーとか実行キーとか送信キーとか、環境によりますけど)
    • good
    • 0

普通、無駄打ちしなくても空白になると思いますけど、無駄打ちしないとどうなります?LOW-VALUEが入る??



いずれにせよ、COBOL一般の話と言うより、環境依存の話ですので、実行環境を書かないと。
    • good
    • 0

現状、どういう処理にしているのですか?

この回答への補足

現状は、PIC X(1) OCCURS 20の配列を用意し、この配列に
直接 ACCEPT 配列名 で受け取ります。
その後、EXITが入力されたかの判定をするのですが、ここで
IF 配列名 = "EXIT"でSTOP RUNです。
このため、コンソール入力者に無駄な空白を打たせなければならず、
この点を改善したいのですが・・・。

補足日時:2009/05/23 19:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QコンソールアプリケーションでのWIN32 APIメッセージ処理

コンソールアプリケーションでのWIN32 APIメッセージ処理

VisualStdio.NET 2005のC++で作成しているコンソールアプリケーションで、
PostMessageでメッセージを送信しているのに、PeekMessageで検出できません。
下のプログラムに誤った点があるのでしょうか?

尚、ウィンドウハンドルの確認部分はパスしますが、
PostMessageとPeekMessageの引数hWndをNULLに置き換えるとメッセージの検出はできるので、
やはり、ウィンドウハンドルに問題があるのかもしれません。


#include <windows.h>
#include <stdio.h>

void main( void )
{
  char OldTitle[1024], NewTitle[1024];
  char WindowText[1024], ConsoleTitle[1024];
  HWND hWnd;
  MSG Msg;

  /*** ウィンドウハンドルの取得 ***/

  GetConsoleTitle( OldTitle, 1024 );
  wsprintf( NewTitle, "%d/%d", GetTickCount(), GetCurrentProcessId());
  SetConsoleTitle( NewTitle );
  Sleep(40);
  hWnd = FindWindow( NULL, NewTitle );
  SetConsoleTitle( OldTitle );

  /*** ウィンドウハンドルの確認 ***/

  GetWindowText( hWnd, WindowText, 1024 );
  GetConsoleTitle( ConsoleTitle, 1024 );

  if ( strcmp( WindowText, ConsoleTitle ) != 0 ){
    printf( "ウィンドウハンドルが不正です" );
    return;
  }

  /*** メッセージの送信と検出 ***/

  PostMessage( hWnd, 1050, 0, 0 );
  do{
    while ( PeekMessage( &Msg, hWnd, 0, 0, PM_REMOVE )){
      printf( "メッセージを検出しました" );
      return;
    }
  } while( 1 );
}

コンソールアプリケーションでのWIN32 APIメッセージ処理

VisualStdio.NET 2005のC++で作成しているコンソールアプリケーションで、
PostMessageでメッセージを送信しているのに、PeekMessageで検出できません。
下のプログラムに誤った点があるのでしょうか?

尚、ウィンドウハンドルの確認部分はパスしますが、
PostMessageとPeekMessageの引数hWndをNULLに置き換えるとメッセージの検出はできるので、
やはり、ウィンドウハンドルに問題があるのかもしれません。


#include <windows.h>
#include <stdio.h>
...続きを読む

Aベストアンサー

ANo2のソースは勘違いでした。
FindWindowで0が返っています。
うまく行っていたように見えただけでした。

http://support.microsoft.com/kb/124103/jaの中に

[FindWindowで]取得した HWND の値は、すべてのウィンドウハンドルを使用する処理において、適切なものであるとは保証されていません。

と書いてあります。

これが正しいのではないかと思います。

Qコンソールで整数を入力(C#)

C#でコンソールから整数を入力したいのですが、
やり方がみつかりません。分かる方教えてください。

C++だと下のようなコードです。

int a;
cout<<"整数を入力して!";
cin>>a;
cout<<"入力した整数は:"<<a;

こんなこと分からなくてすみません...

Aベストアンサー

こんな感じ?

int a;
System.Console.WriteLine("整数を入力して!");
a = int.Parse(System.Console.ReadLine());
System.Console.WriteLine("入力した整数は:{0}", a);

QWinコンソール上でMsysのconfigure

現在Windows上でConsole2+nyaosにて操作を行っています。
c++ソースのパッケージを利用したく./configureを使用するためMinGWとMsysをインストールしました。
私はインストールすればConsole2上で./configureを実行できると思っていたのですが、Msys付属のコンソール上でしかできないようです。
コマンドプロンプト上でも実行できませんでした。
一応MinGWとMsysのbinディレクトリにPathは通してあります。
どうにかしてWindowsのコンソール(Msys付属のではない)上で./configureを実行させることはできないでしょうか。
関係あるかは分かりませんが、MinGWの他にBorlandもインストールしてあります。
よろしくお願いします。

Aベストアンサー

コマンドプロンプト上で ./configure と入力して動作しなかった、ということでしょうか?
だとすれば、3つの点から動作しないと思います。

1) ./configure という書き方は,unix系OSで使われる書式です。MSYSは、unix 系で使われているコマンドの一部をWindowsで動かすものなので、これに準じます。
意味は
. : カレントディレクトリ
/ : パスの区切り
confiugre : 実行ファイル名
です。 コマンドプロンプトでのパスの区切りは\なので、同じコマンドをコマンドプロンプトから実行するには
.\configure
となります。

2) 通常、 configureはシェルスクリプトで記述されています。実行するには、シェルを使う必要があります。
ここで、 unix系OSでは、1行目に 「#!コマンド」 と記述して、ファイルに実行属性を付加すると、
コマンド ファイル
と入力したのと同じになる、という機能があります。MSYSも同様です。
そのため
./configure
と実行すると、で#!以下の記述を使って
sh configure
としたのと同様に動作するようになっています。
コマンドプロンプトにはそんな仕組みは無いので、 sh configure と#!を自分で展開する必要があります。

3) sh configure で実行したとしても、 MSYSで動いているshが持っているシステム情報とWindowsのそれとは異る点があります。この違いがconfigureの実行結果に影響を及ぼす可能性があります。

コマンドプロンプト上で ./configure と入力して動作しなかった、ということでしょうか?
だとすれば、3つの点から動作しないと思います。

1) ./configure という書き方は,unix系OSで使われる書式です。MSYSは、unix 系で使われているコマンドの一部をWindowsで動かすものなので、これに準じます。
意味は
. : カレントディレクトリ
/ : パスの区切り
confiugre : 実行ファイル名
です。 コマンドプロンプトでのパスの区切りは\なので、同じコマンドをコマンドプロンプトから実行するには
.\configure
となります...続きを読む

Q正規表現での入力文字数と連続文字チェック

教えてください。

正規表現を用いて、
最低入力桁数
使用文字
同一連続文字
の制限を掛けたいと思っています。

以下で、6桁以上で[]内で文字の制限も掛けられていると思っているのですが、

^(?=.{6,})[a-zA-Z0-9]+$

上記に、
111111やAAAAAA といった、連続文字を不可にするのを組み込めません。

過去の質問から以下を認めないといった記述でいけるのではと思っているのですが。
(.)\1{5,}

宜しくお願い致します。

Aベストアンサー

申し訳ありません、最後の2文字が欠けましたので訂正します。

^(?!(.)\1{5,})(?=.{6,})[a-zA-Z0-9]+$

Qsyslogをコンソールに出力する方法

syslog.confで出力先を/dev/console(コンソールに出力)に設定したのですが、
logger後、X上のターミナルには何も表示されません。
X上のターミナルはコンソールとは言わないのでしょうか?
上記設定で出力内容を確認するには1~3のrunlevelでないと不可能なのでしょうか?

Aベストアンサー

コンソールは端末の一種ですが、端末はいくつでもつなげられるのに対して、コンソールは(少なくとも論理的には)1つだけです。

xconsole とか xterm -C とかで/dev/consoleに出力される内容をXで表示できます。

QExcelで行データがあるセルから最終セル分だけ同じ文字を入力するもしくは関数を入力するには?

初心者です。
関数等を使えば簡単ですが、データがある分を取得しマクロで一発で作成したいです。

If .Cells(Rows.Count, "C").End(xlUp).Row > 1 Then
maxRow = wS.UsedRange.Rows.Count + 1
 ↑こんな感じでしょうか?

①Excelで行に何かデータがある分だけを取得し、例えばC列に同じ文字”良好”と値を入力したいです。
また、
②Excelで行に何かデータがある分だけを取得し、例えばC列に関数(ifなど)を使って80以上なら、”良好”、80以下なら、”不良”と値を入力したいです。 (=IF(B2>=80,"良好","不良"))

ただし、C列は空白であるか調べて空白だった場合のみに適用するという事にしたいです。
その後、後から行データを入力したところから、マクロを走らせてC列に入力されていない行を判定して上記①か②が適用されるようにしたいです。

すいませんが、よろしくお願いいたします。

Aベストアンサー

<事前にコピーする際のコード一例>をベースにするのであれば、こんな感じになると思います。

Sub sample()
Dim i As Long, lastRow As Long, maxRow As Long, wS As Worksheet
Set wS = Worksheets("Sheet1")
With Worksheets("Sheet2")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
MsgBox wS.Cells(Rows.Count, "A").End(xlUp).Row
'If wS.Cells(Rows.Count, "A").End(xlUp).Row > 1 Then
maxRow = wS.UsedRange.Rows.Count + 1
Range(.Cells(2, "A"), .Cells(lastRow, "D")).Copy wS.Cells(maxRow, "A")
wS.Range(Cells(maxRow, "C"), Cells(maxRow + lastRow - 2, "C")). _
FormulaR1C1 = "=IF(RC[-1]>=80,""良好"",""不良"")"
' …
'End If
End With
End Sub

<事前にコピーする際のコード一例>をベースにするのであれば、こんな感じになると思います。

Sub sample()
Dim i As Long, lastRow As Long, maxRow As Long, wS As Worksheet
Set wS = Worksheets("Sheet1")
With Worksheets("Sheet2")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
MsgBox wS.Cells(Rows.Count, "A").End(xlUp).Row
'If wS.Cells(Rows.Count, "A").End(xlUp).Row > 1 Then
maxRow = wS.UsedRange.Rows.Count + 1
Range(.Ce...続きを読む

QCall of Duty:Modern Warfare 2のチート(コンソール)について

今作のPC版CoD:MW2には、コンソールを利用したチートは無いのでしょうか?
Optionを調べてみてもGameConsoleの項目は見当たりませんし、+seta thereisacow 1337をショートカットに加えてみても変化無しでした。
インテルも実績のみですし、何かもの悲しい感じです。。。

Aベストアンサー

 よく知りませんが、先日チートプレイヤーが大規模にbanされたと発表
されました。壁越しに相手が見えるとか、AIMが異常に早いとか、無限弾
とか色々あったらしいです。
 自分はPS3でプレイする者ですが、PS3でも有るらしいですね。実際
キルカメラで見る限り、自分の姿が壁越しに見えているとしか思えない
攻撃をたびたび受けますね。

QrubyでC言語のexitにあたる構文は?

現在、C言語のプログラムをrubyに書き換えています。

そこで、C言語のexitに当たるrubyの構文、もしくは、
文法が見つからず、困ってます。
(ある条件になったら、強制的にrubyの実行を
 停止させたいのですが、、、)
(__END__ですか?)

詳しい方が居ましたら、ご指南下さい。

Aベストアンサー

#2です。
>exit のあとの数字について詳しく知らないので、
>教えていただけたら幸いです。
exitのあとの数字は終了コードといって、どのような状態で、このプログラムが終了したかを、呼び出しもとに伝える為のものです。
この値は、呼び出し元と、呼び出される側(このプログラム)との決め毎なので、どのようにきめてもかまわないのですが、
ふつうは、終了コード:0で終了したときが、正常終了にします。
それ以外の値は、異常終了を示す値にします。

この終了コードは、なにかのサブルーチンを作ったときの、戻り値に似ています。
サブルーチンの戻り値は、呼び出しもとと呼び出される側(サブルーチン側)とで、自由にきめて良いのですが、
通常は、正常:0、以外は、それなりの異常にしますよね。

Qシスコルーター コンソール接続方法

こんにちは。

シスコのルータとPCをコンソールポートで接続して初期設定する際、PCがWindowsの場合、ターミナルを開いてポート設定でOKをおすとそのまま接続され、ターミナル画面にルータのプロンプトが出ると思いますが、
Linux(CentOS)でウィンドウがない場合の接続方法を教えてください。
コマンドは #console terminal で接続できるのでしょうか。

よろしくお願い致します。

Aベストアンサー

実際に試した事はありませんが、
$ screen /dev/ttyS0 9600
で接続できないでしょうか。

参考URL:http://blog.livedoor.jp/hakin/archives/51266944.html

QVBAのExitイベントについて

VBA(Excel)についてご質問します。

フォームにて、IDというオブジェクト名のテキストボックス、
Private Sub ID_Exit(ByVal Cancel As MSForms.ReturnBoolean)
という関数(Exitイベント)を用意しました。

IDにフォーカスがある状態で、フォーカスを移動しようとすると、この関数が必ず実行されるかと思います。
そのとき、特定のボタン(例えばキャンセルボタン)がクリックされたためにフォーカスが移動したときは、この関数の処理を実行したくない。もしくはこの関数内で特定のボタンがクリックされたこと(そのためにフォーカスが移動したこと)を検出して、処理をスキップしたいです。
どうすれば実現できますでしょうか?
よろしくお願いします。

Aベストアンサー

ANo.1の例です。
ユーザーフォームを作成し、
CommandButton1-4を配置します。
Label1を配置します。

フォームのコードとして下記のコードを作成します。

*下記コードの解説
-各コントロールの移動のイベント(Exit,Enter)では、直接やりたい処理を記述せずに、自分のコントロール名を変数ExitControl, CurrentControl にセットして全体の調整役のSubプロシージャ(ここでは"Mediate"プロシージャ)を呼び出す。
-Mediate内で、移動元のコントロール、移動先のコントロールに応じて実際の処理を行う(例では移動先が"4"の時は処理をスキップし、それ以外にフォーカスが移ったときは一律に処理している)

*使用上の注意
-実際の使用に当たっては、数字とかでなく、ちゃんとコントロール名をつけないと分けわかんなくなる。
-複雑な遷移の処理は、Mediate内に集約されるので管理の煩雑さは緩和される。
-各コントロールでMediateを呼び出す処理を繰り返す部分はめんどくさいし、間違いやすいので、コントロールの数が多いときは、出来ればExcelの数式やVBAで自動的に作成する。

'-以下ユーザーフォーム内に記述するコード---------
Option Explicit

Private ExitControl As String
Private CurrentControl As String


'Mediate 全体の調整役のプロシージャ
'コントロールのフォーカスの移動があるたびに呼び出す。
Private Sub Mediate()
Dim EventText As String
EventText = "Exit:" & ExitControl & "," & "Current:" & CurrentControl
Debug.Print EventText
If CurrentControl = "4" Then
EventText = EventText & "Skip"
Else
EventText = EventText & "DoSomething"
End If

Label1.Caption = Label1.Caption & vbCrLf & EventText
End Sub


Private Sub CommandButton1_Enter()
CurrentControl = "1"
Mediate
End Sub

Private Sub CommandButton1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ExitControl = "1"
CurrentControl = ""
Mediate
End Sub


Private Sub CommandButton2_Enter()
CurrentControl = "2"
Mediate
End Sub

Private Sub CommandButton2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ExitControl = "2"
CurrentControl = ""
Mediate
End Sub


Private Sub CommandButton3_Enter()
CurrentControl = "3"
Mediate
End Sub

Private Sub CommandButton3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ExitControl = "3"
CurrentControl = ""
Mediate
End Sub

Private Sub CommandButton4_Enter()
CurrentControl = "4"
Mediate
End Sub

Private Sub CommandButton4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ExitControl = "4"
CurrentControl = ""
Mediate
End Sub

Private Sub CommandButton4_Click()
MsgBox "Cancel Clicked"
End Sub

ANo.1の例です。
ユーザーフォームを作成し、
CommandButton1-4を配置します。
Label1を配置します。

フォームのコードとして下記のコードを作成します。

*下記コードの解説
-各コントロールの移動のイベント(Exit,Enter)では、直接やりたい処理を記述せずに、自分のコントロール名を変数ExitControl, CurrentControl にセットして全体の調整役のSubプロシージャ(ここでは"Mediate"プロシージャ)を呼び出す。
-Mediate内で、移動元のコントロール、移動先のコントロールに応じて実際の処理を行う(例で...続きを読む


人気Q&Aランキング