自作のターミナル的なアプリケーションを作成したいと考えているのですが、
通常ターミナルでは、プロンプトの状態でエンターしたらプロンプトが再表示されるのですが、
[例]
$ ←ここでエンター
$ 再表示される
scanfでそれをしようとすると、なにも表示されません。おそらくまだ入力待ちになっています。
scanfの使用上エンターを読み取れないと言っていた人がいたので、代替出来る関数はありませんか?
また、scanfで出きるなら方法を教えて下さい。
ーーー|使用環境|ーーー
OS:Linux(Debian派生)
コンパイラー:GCC
C言語は初めて1年ほどになりますが、途中JavaにいったりHaskellにいったりしてたので、経験は半年分ぐらいです。
よろしくお願い致します。
No.4ベストアンサー
- 回答日時:
%c ならとれるよ.
ありがとうございます。
反応しました!!
一応認識するのに必要なコードを張っときます。
//以下コード
#include <string.h> //stringヘッダーが必要。stdio.hはインクルード前提
int main(void){
char cmd[100];
do{
printf("$");
scanf("%c", cmd);
if(strcmp(cmd , "\n")==0){ }
}while(1);
}
//コード終了
これで通りました。
一番手っ取り早かったのでベストアンサーにさせていただきます。
ほんとにありがとうございました。
No.6
- 回答日時:
一行分を fgets で取ってから sscanf で解析し、
戻り値で目的の入力値が取れたか確認しましょう。
#define N 256
char buff[N], cmd[N], param[N];
while (1) {
_ printf("$ ");
_ fgets(buff, N, stdin); // 安全のために最大桁も指定
_ int n = sscanf(buff, "%s %s", cmd, param);
_ if (n == 0) 単純エンターの場合();
_ if (n == 1) cmdだけ取れた場合();
_ if (n == 2) break; // 無限ループ抜ける
}
cmdとparamが取れた処理(cmd, param);
わざわざありがとうございます。
しかし、これだと、起動時に、プロンプトが
$ $
のように二つ表示されてしまうんですよね・・・。
いろいろ頑張ってみますが、もし原因がわかるのならおしえてほしいです・・・。
No.5
- 回答日時:
私はscanfなんて不便なもの使わないです。
①まず一行メモリに読みこむ
②メモリ上の行を解析する
の方が圧倒的に楽。
まだまだ初心者な面もありますので(というか初心者なので)ちょっとむずかしいですかね。
でもC言語をやってる以上いつかはメモリ操作ぐらい出来ないといけませんよね・・・。
・・・頑張ります。
No.3
- 回答日時:
> scanfの使用上エンターを読み取れないと言っていた人がいたので、代替出来る関数はありませんか?
使用OSはLinuxでしょ?
Debian系なら、
sudo apt-get install libedit-dev
してreadline関数を使うのが一番無難だと思いますよ(Windows相手だとこれがオススメ出来ない)。
使う場合はheaderで
#include <editline/readline.h>
#include <editline/history.h>
して(2つ目は履歴編集の為のヘッダですが、便利です)、例えば
char* input = readline("$ ");
add_history(input);
として使えば貴方が要求する仕様に合うと思いますよ。
/usr/bin/ld: /tmp/ccH1dR8D.o: in function `main':
kernel.c:(.text+0x2ff): undefined reference to `readline'
/usr/bin/ld: kernel.c:(.text+0x30f): undefined reference to `add_history'
collect2: error: ld returned 1 exit status
というエラーでコンパイルが止まってしまいました。
原因はなんでしょうか・・・。
No.2
- 回答日時:
scanf関数では無くてgetchar関数を使用してみてはどうでしょうか。
C#しか書けないのですが、C#では
System.Console.ReadLine()
の代わりに
System.Console.ReadKey()
を使用しています。
つまり、入力されたキーをstring形式にしたバッファーを作成し、
getcharで1文字1文字を取得しています。
以下 C#のサンプルです。
アルゴリズム的には同じだと思うので参考にしてみてください。
public static unsafe Object GetLine()
{
try
{
//コンソールの一番左に移動
CursorLeft = 0;
//$>と表示
Write("$> ");
//現在の左からの距離を保存しておく
Object tmp = CursorLeft;
//無限ループ
while (true)
{
//文字色を緑に変更
ForegroundColor = ConsoleColor.Green;
//一つキーを押してもらう
ConsoleKeyInfo c = ReadKey(true);
//Enterだった場合は終了
if (c.Key == ConsoleKey.Enter) break;
//削除だった場合はバッファーから1文字削除
else if (c.Key == ConsoleKey.Backspace)
{
//文字数が0以下でバッファーから削除できない場合はビープ音をならす
if (0 < comtmp.Length)
{
comtmp.Length -= 1;
CursorLeft -= 1;
Write(" ");
CursorLeft -= 1;
}
else Beep();
}
//普通の文字だった場合はバッファーに追加
else comtmp.Append(c.KeyChar.ToString());
//文字列の入力を受け取る前の状態にする
CursorLeft = (int)tmp;
//バッファーの文字を表示
Write(comtmp);
}
//入力が終わったはずなので改行する
WriteLine();
}
catch (Exception e)
{
BackgroundColor = ConsoleColor.Black;
ForegroundColor = ConsoleColor.Red;
WriteLine(e);
}
return comtmp.ToString();
}
なるほど、C#についての知識などはありませんが、そのようなアルゴリズムもあったというのが参考になりました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
scanf関数について
-
プログラミング初心者です。 Py...
-
Excel VBAで、Application.Inpu...
-
入力値が1以下、かつ数字以外の...
-
小数か整数かを判定する方法
-
キー入力制限について
-
C言語でgetchar();が上手く使え...
-
WindowsでEOF
-
scanf が無視されます
-
数字以外が入力されたらエラー...
-
コマンドプロンプトからのEOFの...
-
2進数の1の数を数える問題
-
プログラムの実行時に'<'でリダ...
-
ワードで文字を入力する時の変...
-
VisualStudio2019のコードアナ...
-
C言語でタイミングを合わせるゲ...
-
プログラミングC言語について
-
getchar使用時の入力文字消去方法
-
Date関数で書いた日付がおかしい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
プログラミングの問題です 「金...
-
Eclipseコンソール表示を、リセ...
-
C言語 逆ピラミッドの作り方
-
"scanf"でエンターで改行させな...
-
scanf が無視されます
-
if文の条件にscanf関数を使うと…?
-
C言語について
-
C言語scanf_sで何故か2回入力に...
-
Excel VBAで、Application.Inpu...
-
小数か整数かを判定する方法
-
cout関数を使っているのですが...
-
double型が正常に認識されてい...
-
scanfが2回使えない・・・?;
-
C言語でgetchar();が上手く使え...
-
WindowsでEOF
おすすめ情報
具体的にはどのようにソースを組めばよいのでしょうか。
main関数のみでもいいので教えていただけませんか?