キー入力を調べるために以下の
プログラムを作成したのですが・・・

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(void)
{
intinkey = 0;

while (1) {
inkey = getch();
if (inkey == 0x1b) {
break;
}
printf("%d %x\n", inkey);
}

}

↑↓→←とかのキーは、
変数inkeyの値を表示する前に、
0 0と表示されます。
なぜなんでしょうか?
ほかのキーでは、普通に表示されます。
教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

まず、cherry_moonさんが書かれている様に、printf() 関数の使い方が


おかしいですね。この場合、 printf("%d %x\n", inkey, inkey); と
書くのが正解かも知れませんね。

ただ、ご質問の内容は、何故、矢印キーの場合は、値を表示する前に 0 0
と表示されるのかと言う事なので、意図している回答とは違いますね。

で、何故、0 0 と表示されるかですが、それは、 getch() の仕様です。
リファレンスマニュアル等をもう一度読まれてみてはどうでしょうか?
ファンクションキー、矢印キーなどは、getch() は2回呼び出されると
書かれているかと思います。また、その1回目は、0、または 0xE0 が
返されると書かれています。
    • good
    • 0
この回答へのお礼

リファレンスマニュアルとか無いんです。
全部無料の使ってますから。

ありがとうございました。
でも、プログラム自体には、
printf()関数の使い方以外問題は
無かったようですね。

これぐらいのことなら、getch()関数を
検索すればよかったのかなぁ・・・なんて。
(聞いておいてすいませんです。。。)

また、お世話になるかもしれませんが
よろしくお願いします。

お礼日時:2002/04/03 11:41

> printf("%d %x\n", inkey);



ここがおかしいです。
printf("%d %x\n", a, b);
と書くと、a を 10 進数で、 b を 16 進数で出力する。
という意味です。

mayoler さんの場合、b になるものがありません。
%d か %x のどちらかを消してみて下さい。
    • good
    • 0
この回答へのお礼

一回やったんですが、
inkey変数を引っ張るのは一回でも、
できるんで、そのままにしちゃったんですけど。。。

お礼日時:2002/04/03 11:42

このQ&Aに関連する人気のQ&A

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

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

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

QC++ の typedef の 使い方の質問

C++のtypedefの使い方の質問ですが、typedefは、別名の定義として、知られていますが。
以下のソースの意味がよく読み取れないです。windows プログラミングとC++
が分かるかたがいれば、以下のソースの意味を教えていただきたいです。

よろしくお願いします。
typedef BOOL (WINAPI *AddAccessAllowedAceFn)(
PACL pAcl,
DWORD dwAceRevision,
DWORD AceFlags,
DWORD AccessMask,
PSID pSid
);

Aベストアンサー

関数ポインタの別名定義です。
「関数ポインタ typedef」をキーワードにWeb検索してみてください。
丁寧に解説されているサイトが見つかるでしょう。

QC言語のプログラムで#includeを使わず#includeだけで

C言語のプログラムで#include<math.h>を使わず#include<stdio.h>だけで√(sqrt)を表現することは可能でしょうか?

Aベストアンサー

ご自分で sqrt 関数を作れば可能です。
こんな感じでしょうか。

#include <stdio.h>

static double
sqrt (double s)
{
 double x = s / 2.0;
 double last_x = 0.0;

 while (x != last_x)
 {
  last_x = x;
  x = (x + s / x) / 2.0;
 }

 return (x);
}

int
main (int argc, char * argv[])
{
 printf ("sqrt (%f) = %f\n", 3.0, sqrt (3.0));
}

QC++.NET の String型の使い方

初めて質問いたします。
C++ .NET 2005 Express Beta版を入手し、Windows Formsのプログラミングを勉強してます。

TextBoxのTextに値を変数で指定したいのですがどうすれば良いのかわかりません。

  textBox1->Text = "Test";
とダイレクトに値を指定すればできるのですが、

  #include <string>
  using namespace std;
   (省略)
  string str = "Test";
  textBox1->Text = str;
は、エラーになってしまいます。

C++標準のstringクラスではなく、.NETはStringクラスがあるようですが、これの使い方がMSDN等で調べているのですが分かりません。
分かりやすいURLなどありましたら教えていただけませんか。

Aベストアンサー

textBox1->Text = new String(str.c_str());
でいけるんじゃないかなあ。
試してないのでなんですが、
C++のstringクラスからは、c_str()で、いわゆるNULL終端文字列へのポインタが得られて
.NETのStringクラスは、NULL終端文字列でのコンストラクタがありますから。

Q#include

#include <stdio.h>

struct st
{
char a[3];
short b;
char c[7];
long d;
char e[5];
};

int main(void)
{
printf("%d\n",sizeof(struct st));
return 0;
}

コンパイルオプションでアライメントを変化させながら(1,2,4,…)
sizeof(struct st)の変化を見たいのですが、コンパイルする時に
どのようにすれば良いのでしょうか?当方、gccを使用しております。

あと、ついでなんですが、警告オプションは-Wと-Wallしかないのでしょうか?

Aベストアンサー

GCCのマニュアル
http://gcc.gnu.org/onlinedocs/index.html
日本語訳は古いバージョンのしか見つからなかった。

> アライメントを変化させながら
http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes

コンパイラオプションでやるなら、-Dでマクロを使うなりして。
インテルプロセッサだと
http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options

> -mpreferred-stack-boundary=num
> -mincoming-stack-boundary=num
というあたりも関係あるかも

>警告オプションは-Wと-Wallしかないのでしょうか
http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Warning-Options.html#Warning-Options

GCCのマニュアル
http://gcc.gnu.org/onlinedocs/index.html
日本語訳は古いバージョンのしか見つからなかった。

> アライメントを変化させながら
http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes

コンパイラオプションでやるなら、-Dでマクロを使うなりして。
インテルプロセッサだと
http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options

> -mpreferred-stack-boundary=num
> -mincoming-stack-boundary=num
とい...続きを読む

Qc++ stringの使い方

お世話になります。
最近c++始めました。
stringの使い方がよくわかりません。
以下のstringの使い方が問題ないか確認頂けますか。
スマホで書くため、文法が合ってないと思いますが、stringの使い方だけ確認させてください。
引数にstringで囲って渡すのは実装として普通行いますか。
やってはいけないですか。
是非ご教示ください。

#define STR1 "mojiretu"
main()
if(check(string(STR1)))



bool check(string str)

Aベストアンサー

間違っちゃいないけど、直に const string でかまわんのでは?

#include <iostream>
#include <string>

const std::string STR1 = "mojiretu";

bool even_length(const std::string& str) {
return str.length() % 2 == 0;
}

int main() {
if ( even_length(STR1) ) {
std::cout << STR1 << " : even\n";
} else {
std::cout << STR1 << " : odd\n";
}
}

Q   #include

   #include<stdio.h>
#include<math.h>

int main(void)
{
int i,n,limit;
printf("data? ");
scanf("%d",&n);
i(n>=2){
limit=int)sqrt(n);
for(i=limit;i1;i--){
if(n%i==0)
break;
}
if(i==1)
printf("素数\n);
else
printf("素数でない\n");
}
return 0;
}

というプログラムがあるのですが、それを改良して int型(符号付32ビット整数)および、unsigned int型(符号なし32ビット整数)のそれぞれの最大の素数を求めよという問題があり、ただし、エラトステネスのふるいは使わずに、上のプログラムを改良してみよという問題がどっかにあったんですが、全然わからないので、教えてください。

   #include<stdio.h>
#include<math.h>

int main(void)
{
int i,n,limit;
printf("data? ");
scanf("%d",&n);
i(n>=2){
limit=int)sqrt(n);
for(i=limit;i1;i--){
if(n%i==0)
break;
}
if(i==1)
printf("素数\n);
else
printf("素数でない\n");
...続きを読む

Aベストアンサー

最初に。
このプログラム、ところどころ打ち間違いがあります。直しておきましょう。
i(n>=2){
limit=(int)sqrt(n);
for(i=limit;i>=1;i--){

まず、プログラムを、機能ごとに分けて考えます。

printf("data? ");
scanf("%d",&n);
が素数判定する数値nを決めるところ

if(n>=2){
から return 0 ; の前の
}
までがn が素数かの判定しているところ
です。

では、改造に入ります。
intの範囲での最大の素数、ということなので、 intの最大値 から順番に素数判定を行い、最初に見つかった素数が、求める値、となります。

元はnをキーボードから入力しています。
これをキーボード入力ではなく、プログラム中で「intの最大値 から順番に」するには、どうしたらいいと思いますか?

元の判定部は
if(i==1)
printf("素数\n);
else
printf("素数でない\n");
です。これは n に対して「素数/素数でない」と表示されます。
改造するときに
・「素数でない」という表示は必要でしょうか?
・「素数」という表示ではnはわかりません。 nも表示するにはどうしたらいいと思いますか?
・素数が見つかったら、ループを抜けないと、int型の全ての素数を表示するプログラムになってしまいます。ループを抜けるにはどうしたらよいでしょうか?

以上の考えかたで、改造できると思いますが、いかがでしょうか。

unsigned int版へは次の2点を変更します。
・計算に使う変数はunsigned intにする必要がある。
・nはunsigned intの最大値から順番に

最初に。
このプログラム、ところどころ打ち間違いがあります。直しておきましょう。
i(n>=2){
limit=(int)sqrt(n);
for(i=limit;i>=1;i--){

まず、プログラムを、機能ごとに分けて考えます。

printf("data? ");
scanf("%d",&n);
が素数判定する数値nを決めるところ

if(n>=2){
から return 0 ; の前の
}
までがn が素数かの判定しているところ
です。

では、改造に入ります。
intの範囲での最大の素数、ということなので、 intの最大値 から順番に素数判定を行い、最初に見つかった素数が...続きを読む

QVisial C++おけるπの使い方

自宅でCプログラミングの練習をするためVisial C++ 2008を使って
プログラムをしています。y<sin(πx)となった時の
割合などを計算するプログラムで                「M_PIが定義されていない識別子です」
とでてきます。所持している本を参考にしてもM_PI=πとして用いる
と書いてあり、math.hもインクルードしてるので原因が分からなくて
困ってます。Visial c++ではπの使い方には何か別の使い方がある
のでしょうか?よろしくお願いします。
*↓が実際に作ったプログラムです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main(void){
int i,n,count=0;
double x,y,r,error;

srand((unsigned)time(NULL)); /*乱数の初期化*/

printf("How many trials?");
scanf("&d",&n);

for(i=0;i<n;i++){
x=rand()/(RAND_MAX+1.0);
y=rand()/(RAND_MAX+1.0);

if(y<sin(M_PI*x)){
count++;
}
}

r=(double)count/n; /*キャスト演算子を使用*/
error=2/M_PI-r;

printf("Result is %f (Error: %f)\n",r,error);

return 0;
}

自宅でCプログラミングの練習をするためVisial C++ 2008を使って
プログラムをしています。y<sin(πx)となった時の
割合などを計算するプログラムで                「M_PIが定義されていない識別子です」
とでてきます。所持している本を参考にしてもM_PI=πとして用いる
と書いてあり、math.hもインクルードしてるので原因が分からなくて
困ってます。Visial c++ではπの使い方には何か別の使い方がある
のでしょうか?よろしくお願いします。
*↓が実際に作ったプログラムです。
#include ...続きを読む

Aベストアンサー

★アドバイス
・math.hをインクルードする前に『_USE_MATH_DEFINES』定数を define します。

#define _USE_MATH_DEFINES
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main( void )
{
 :
 return 0;
}
必ず include する前に定義して下さい。

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

QcygwinでのC++の使い方

cygwinでC言語で書いたプログラムを実行したいのですがcygwinを起動すると
私の名前@なにやらアルファベット
が表示され次の行に

と表示されるんですがこの後にどんなことを書けば
#include<・・・>
としてC++のプログラムを書いていくことができるんですか?そもそもcygwinの使い方が根本的に違うんですかねえ?それともメモ帳かなんかにプログラムを書き保存しそれをcygwinで実行するんですかねえ?とりあえずプログラムを実行できるようにしてください。おねがいします。

Aベストアンサー

> それともメモ帳かなんかにプログラムを書き保存しそれをcygwinで実行するんですかねえ?

おおむねその通りです。

メモ帳でも何でもよいので、エディタでソースファイルを作成してください。作成したソースファイルは、とりあえずホームディレクトリに格納するとよいでしょう(C:\cygwinにCygwinをインストールしたのであれば、C:\cygwin\home\アカウント名がホームディレクトリになります)。

作成したソースファイルがfoo.cppだった場合、

g++ foo.cpp

とすれば、a.exeという実行ファイルが同じディレクトリにできるはずです。そこで、

./a

と入力すれば、a.exeを実行することができます。

Q#include

#include <stdio.h>の <> の意味と
#include "xxxxx.h"の "" の意味を教えてください。

Aベストアンサー

厳密な定義を、「JIS X3010:2003 - 6.10.2 ソースファイル取り込み」から引用します。

---- 引用ここから ----
制約 #include指令は, 処理系で処理可能なヘッダ又はソースファイルを識別しなければならない。
意味規則 次の形式の前処理指令
    # include <h文字列> 改行
は, 処理系定義の場所を順に探索して, <区切り記号と>区切り記号の間で指定した文字列で一意に決まるヘッダを見つけ, そのヘッダの内容全体でこの指令を置き換える。どのようにして探索の場所を指定するか, またどのようにしてヘッダを識別するかは, 処理系定義とする。
 次の形式
    # include "q文字列" 改行
は, 二つの"区切り文字の間で指定した文字列で一意に決まるソースファイルの内容全体で, この指令を置き換える。指定したソースファイルの探索順序は処理系定義とする。この探索をサポートしていない場合, 又は探索が失敗した場合, 同じ文字列(もしあれば>文字を含めて)を含む次の知れに読み替えたのと同じ規則で再処理する。
    # include <h文字列> 改行
---- 引用ここまで ----

要するに、<xxx>の場合は処理系定義のヘッダ(ファイルとは限らない)を取り込み、"xxx"の場合はソースファイルを取り込むということです。いずれも探索場所やその順序は処理系定義です。

よくある誤解は、
・ヘッダは必ずファイルである。
・"xxx"ではカレントディレクトリや取り込もうとしたファイルと同じディレクトリから探索を始める。
といったものです。このように実装されている処理系が多いことは確かですが、標準規格ではそのような規定はありません。
使用している処理系がどのような実装になっているかは、マニュアルに記載があるかと思います。

厳密な定義を、「JIS X3010:2003 - 6.10.2 ソースファイル取り込み」から引用します。

---- 引用ここから ----
制約 #include指令は, 処理系で処理可能なヘッダ又はソースファイルを識別しなければならない。
意味規則 次の形式の前処理指令
    # include <h文字列> 改行
は, 処理系定義の場所を順に探索して, <区切り記号と>区切り記号の間で指定した文字列で一意に決まるヘッダを見つけ, そのヘッダの内容全体でこの指令を置き換える。どのようにして探索の場所を指定するか, またどのようにして...続きを読む


人気Q&Aランキング