• ベストアンサー

C言語で作成したプログラムの、エコーバックをなくしたい…。

現在、SolarisでC言語の簡単なアプリケーションを作成しています。 そこで、管理者以外の人に悪用されないようにという名目で、作ったプログラムを端末エミュレータで起動させ、それに標準入力からパスワードを入力させるようにしたいと考えています。 しかし、そのためには、入力したパスワードをターミナル上に表示されては困るので、ターミナルに入力された文字列を表示させないようにするにはどうしたらよいのでしょうか? いろいろと調べたのですが、具体的な関数がよくわからなかったので、エコーバックをなくすような関数がありましたら、是非教えてただきたいと思います。

  • ryo-3
  • お礼率64% (146/226)

質問者が選んだベストアンサー

  • ベストアンサー
  • furlong
  • ベストアンサー率50% (17/34)
回答No.3

結構、面倒です。覚悟してください。入出力がファイルにリダイレクトされている場合の処置とか、途中でCtrl+Cを押された場合の始末とか、諸々を付け加えると100ステップを超えてしまうかもしれません。 #include <termio.h> struct termio tbuf; char passowrd [100]; ioctl (0, TCGETA, &tbuf); tbuf.c_lflag &= ~ECHO; ioctl (0, TCSETA, &tbuf); fputs ("password: ", stdout); fgets (password, stdin); tbuf.c_lflag |= ECHO; ioctl (0,TCSETA, &tbuf);

その他の回答 (3)

  • onti
  • ベストアンサー率37% (9/24)
回答No.4

パスワード入力のプロンプトになったら、標準出力を close()してしまえば、画面には出力されなくなると 思いますが、だめでしょうか?

  • Rhythmic
  • ベストアンサー率0% (0/1)
回答No.2

ioctlってシステムコール使えばやれると思いますよ。 Linuxではやったことありますが、多分Solaris(Unix)でも いけたはず・・・ ioctlの使い方はmanでも見て下さい。

  • madman
  • ベストアンサー率24% (612/2465)
回答No.1

このソースを試してみてください。 ヒントになるでしょう。 Enterキー入力後にエコーバックします。 キーワードはsttyコマンドです。 ---- #include <stdio.h> main() { char bf[1000]; memset(bf, NULL, 1000); printf("PASSWD:"); system("stty -echo >/dev/null 2>&1"); scanf("%s", bf); system("stty echo >/dev/null 2>&1"); printf("\nエコーバック=>%s\n",bf); }

ryo-3
質問者

補足

お答えありがとうございます! しかし、system関数を使わずに、C言語の関数(ライブラリを含む)ですることはできるのでしょうか?

関連するQ&A

  • c言語 プログラム メニュー

    C言語のプログラムでメニューの原型を作りたいと思っています。 内容としては ・標準ライブラリのみ ・関数を自作する ・関数の中身はprintfやscanfなど初歩的なもののみ ・メニューといっても1◯◯、2◯◯、3◯◯、4終了を表示(◯◯は適当)し、キーボードで1、2、3が入力されるともう一度メニューが表示されるというものです。(4のみプログラム終了) ご協力お願いします。

  • C言語でパスワード作成ツール

    C言語で以下のプログラムを作らなくてはなりません。 どなたかご教授くださるようお願いいたします。 1 入力された値を階乗するプログラム <表示>   値を入力してください。   答え:XXXXX 2 パスワード作成ツール <使用方法>   ./mypasswd [user ID][パスワード文字数] <機能>   下記の条件にあった任意の文字列を標準出力に返す。 条件1 引数[user ID]は必須 条件2 指定できる出力文字列は6,7,8文字のいずれかとする(省略可、デフォルト8文字) 条件3 出力もじる津を構成する文字列範囲はa~z、A~Z、0~9とする。 条件4 ユーザーアカウントに含まれる文字列を含まない。 条件5 英大文字を最低1文字含む。 条件6 英小文字を最低1文字含む。 条件7 数字を1文字含む。 <設計>   下記の関数を組み合わせる。 関数1 引数チェック関数(条件1、2) 関数2 ヘルプを表示する関数(条件1、2、の説明文を表示する) 関数3 時刻を種にした乱数を用いて、任意の1文字を返す関数 関数4 ある1文字が使用可能文字列に含まれるものかどうかを判断する関数(条件3) 関数5 ある1文字が、userIDに含まれるものかどうかを判断する関数(条件4) 関数6 関数3~5を利用して、パスワ-ドに使用することが出来る文字列を返す関数 関数7 関数6を利用し、条件5~7が考慮された文字列を返す関数 3 入力された計算式を計算するプログラムを作成 <機能>   +-*/(括弧は使用しない)の組合せで小数も扱う。   敷の最大長は100文字までとする。 <表示>   計算式を入力してください。   答え:XXXXXXXXXX

  • C言語のアルゴリズムについて

    C言語で「標準入力から英語の文章を読み込んで,文字列Ilmorが出現した行をその行番号とともに表示するプログラムを作りなさい.」とプログラムを作りたいのですが、文字列を発見するところまでは分かるのですが、その行どうやって表示すればいいのか分かりません。また、文章を読み込むのもすごくややこしく最後にエンターを二回押すなどの制限があります。(scanf) 参考になるプログラムを書いていただける方いませんか?できればC言語のアルゴリズムについて詳しく書いた本やサイトがあれば教えていただきたいです。 レベルは超入門的な本を2,3冊読んだ程度です。アルゴリズムなどにはまったく触れてなかったし、ライブラリー関数も少ししか載ってなかったので関数の本もあれば教えていただきたいです。

  • C言語について

    最近C言語を始めたばかりです。 誰か教えてください。 私の勉強している、明解C言語入門の演習2-6で、  以下に示すように、身長を整数値として読み込んで、標準体重を実数で表示するプログラムを作成せよ。標準体重は(身長-100)×0.9によって求め、その小数点以下は、1桁だけ表示すること。    身長を入力してください。  標準体重は67.5です。 がわかりません。  念のため、私の作ったものを参考にして答えを教えていただけないでしょうか? #include <stdio.h> int main(void) { int na; puts("身長を入力してください。"); printf("身長:"); scanf("%d",&na); printf("標準体重は[%.1f]です。%n", (double)(na - 100) * 0.9); return(0); }

  • 標準ライブラリだけでgetch関数を作成する方法

    getch関数は非常に使い勝手が良くて、キーボードから入力した文字を画面にエコーバックしませんし、エンターキーなどを押す必要もありません。 このgetch関数を標準ライブラリだけを使って作成することは可能でしょうか? ぜひよろしくお願いします。

  • C言語

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文字列の逆順に入れ替える処理を実現してください.なお,以下の要件を満たしたプログラムを作成してください. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力してください.そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成してください. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • C言語で三目並べをするプログラムの作成

    C言語で三目並べ(いわゆる○×)をするプログラムを作成したいのですがうまくいきません;; どなたか教えてください。よろしくお願いします。 条件 ・コンピュータの手はランダムに決定するものとする(空いているところに打つ) ・盤面を表現する配列は3×3の二次元配列とし、グローバルに宣言する ・以下のような関数を作成すること:盤の表示、○×を打つ、3つ並んだかチェック ・他にも必要に応じて関数を宣言すること ヒント集 ・マスの状態は空:0 ○:1 ×:2など数値で定義するとよい。 ・char stone[3][3]={"-","○","×"};などと宣言しておくと便利? ・9マスしかないので、9マス打ち切ったら終了→このとき勝敗が決まっていなければ引き分け ・ループの考え方は2通りできる  1.先手後手がセットで1ループ、9マス目に先手が打ったらbreak 2.先手、後手それぞれ1ループ,nマス目は、n%2=0なら先手、n%2=1な  ら後手 ・三目並んだかのチェックは工夫のしどころ  ・手盤の人の石だけチェックする  ・打ったところの縦横は必ずチェック、斜めはどうする? ・作っていく順  ・石の入力+盤面表示、コンピュータの手番、3つ並んだかチェック、勝敗表示  ・石の入力+盤面表示、3つ並んだかチェック、勝敗表示、コンピュータの手番

  • C言語の実行結果

    C言語プログラムで、scanfにした時、実行結果では入力した文字がそのまま表示されますが、その表示をパスワードみたいに*で表示サせることはできないのでしょうか?

  • C言語・標準入力でquitを入力で終わるプログラム

    C言語標準入力でquitを入力で終わるプログラムを作っているのですが うまくいきません #include <stdio.h> int main(void) { int i, n; double data[100]; printf("数字を入力してください。\n"); printf("入力を終えるときにはCtrl-dを押してください。\n"); n = 0; while (scanf("%lf", &data[n]) != EOF) { n++; } for (i=0; i<n; i++) { printf("data[%d] = %f\n", i, data[i]); } return (0); } と今はとりあえづ作ってみたのですが 今のままではCtrl-dでループから抜ける形になっています strcmp関数を使うとは思うのですが strcmp関数はchar型なのでエラーが出てしまいます; このやり方じゃないchar型にしてやり直さないといけないでしょうか; Linux CentOS gcc でやっています 標準入力で数字を入力しそれを格納 quitを入力するまで繰り返す quitを入力で終了、これまで格納していた文字列の表示 簡単なプログラムの流れとしては上記の感じです よろしくお願いします。

  • C言語の標準関数の引数の順番について

    C言語標準関数の引数についての質問です。 strcpy、memsetなど C言語の標準関数の引数に注目したところ 前に出力パラメータを持ってきているものが多いように思えます。 例えば、 char *strcpy(char *dest, const char *src); の場合、 第1引数の"dest"が出力パラメータで 第2引数の"src"が入力パラメータとなっています。 入力よりも出力を前に持ってきている理由が何かあるのでしょうか。 今後、自分が設計をするときの参考にしたいと考えているので 理由を知っている方がいたら教えて下さい。

専門家に質問してみよう