RS232Cで文字列を送信するCプログラムを作成しています、がうまくいきません。OSはLINUX fedora7です。
状況は、
・RS232対応の測定機器にプログラムを使ってコードを送る
 →エラー表示される(何かしら送信はされている?)。
・確認のためクロスケーブルを用いてPC-PC間で送受信を行う
 →何も受信されない(受信プログラムは動作確認済みのものを使用)。
・ポートやボーレート、パリティ、フロー制御の一致は確認しました。
送信プログラムはThe Linux Serial Programming HOWTOに置かれている受信プログラムのサンプルを基に作成しました。
私のいじったプログラムに問題があるように思っていますが、その点を把握できません。
プログラミングでもそれ以外でも、何か原因に思い当たる節のある方がいましたら、御指導の程よろしくお願いします。

以下にプログラムを記します。
*キーボードから入力した文字列を送信し、eを打ち込むと終了するプログラムのつもりです…(^^;

main(){
int fd,res,;
struct termios oldtio,newtio;
char send[255];

fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {printf("error");
perror(fd); exit(-1); }
**********************
termios設定文、省略(serial HOWTO のサンプルそのまま)
**********************
while(1){
printf("入力待ち\n");
scanf("%s",send);
printf("%s\n",send);

if( *send =='e'){
printf("終了");
break;
}
else{
res = write(fd,send,255);
send[res]=0;
printf("%s,%d\n", send,res);
}
}
tcsetattr(fd,TCSANOW,&oldtio);
}

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

A 回答 (5件)

>・RS232対応の測定機器にプログラムを使ってコードを送る


> →エラー表示される(何かしら送信はされている?)。

シリアル通信で何かを受け取る機器は、普通「特定のコマンド」を受け取り、受け取ったコマンドに対し、数バイトのレスポンスを返します。

機器によっては、1度コマンドを送ったら、レスポンスを拾ってあげるか、強制リセットのコマンドを送ってあげるまで、次のコマンドに応答しないのが普通です。

例えば、ある機器では、以下のようにしなければなりません。

1.'\x06'が返って来るまで、'\x16'を1文字づつ送り続ける(強制リセットコードの送信)
2.'\x06'が返って来たら、'I'を送って、'\x06'が返って来るのをまつ(初期化コマンドの送信と応答待ち)
3.'\x06'が返って来たら、'S' '1' '0' '0' '\n'の5文字を送って、'\x06'が返って来るのをまつ(設定コマンドの送信と応答まち)
(以下略)

このように「機器ごとに決められた手順」に従って送受信をしないと、機器がエラーを起こし「それっきり」になります(強制リセットのコードを送り付けるか、機器の電源を入れ直してやらない限り、2度と応答しません)

>PC-PC間での送信では同じPCを用いたのでそこまでの差が出るようにも思われません。

いいえ。昨今のPCの速度から考えると「相対的な速度で言えばRS232Cは信じられないくらい遅い」ので、そこがボトルネックになって「送信のオーバーフロー」と「受信のアンダーフロー」が起きます。

「送信のオーバーフロー」とは「PCが大量に一気にシリアルポートに書き込もうとしたら、通信が遅くて、言われたバイト数の一部しか受け付けられないか、1バイトも受け付けられないで、残りを捨ててしまう状態」を言います。もちろん「何バイト書けたか」を見て、残りを送り直ししないと、ちゃんと全部送信出来ません。

「受信のアンダーフロー」とは「PCが一気に大量にシリアルポートから読もうとしたら、通信が遅くて、言われたバイト数の一部しか受け取れないか、1バイトも受け取れないで、そうこうしているうちにタイムアウトエラーになってしまい、途中までしか受信しなかった状態」を言います。もちろん、こっちが受信を途中で止めたのに相手はまだ送信を続けてるでしょうから、続きをちゃんと全部受信してやらないといけません。

送信PCを「製造工場」、受信PCを「商品倉庫」、RS232Cを「輸送トラック」と考えてみて下さい。

「製造工場」も「商品倉庫」も高性能です。でも「輸送トラック」は遅いです。法定速度(決められたボーレート)で走らないとなりません。

「製造工場で日に2万個製造」していて、商品倉庫は「1日に2万個の商品を仕分けできる」としても「輸送トラックは1日に千5百個しか運べない」としたら?

製造工場では「1日にトラックで運べる数しか製造しちゃダメ」ですし、商品倉庫は「トラックが来なきゃ従業員はやる事無し。本日最後に到着するトラックの荷物を仕分けし終わったら、昼前であっても帰ってよし」です。

このように「製造工場と商品倉庫の性能が同じ」でも「輸送トラックが遅い」と「商品を小出しに送り出す」「商品を小分けで受け取る」と言う処理が必要です。

RS232C通信でもそれは同じで「同じPCを用いたとしても、通信媒体の速度が比べられないほど遅ければ、送信と受信は小分けして処理せねばならず、2つのPCの性能がどうのこうのって話は無意味」です。
    • good
    • 0
この回答へのお礼

丁寧な説明ありがとうございます。初心者には助かります。
重ね重ね恐縮ですが疑問点2つあります。

前半部分については、今プロトコルを勉強をしてまして、恐らくHDLC手順や無手順プロトコルと言った話なのではないかと思いますが、それをどのようにプログラムに書き込んだらよいのかがわかりません。
ただ単に制御コードを送りたい情報の前後等に、文字列として送ってやればよいのでしょうか?

後半部の話は、sleep等で待ち時間を調節してやれば良い。という理解でよろしいでしょうか?

あまりお手を煩わせるのもなんですので、参考サイトなどで十分ですのでよろしくお願いします。

お礼日時:2009/05/21 11:23

>>ひとつ質問なのですがバッファを一度0x00で埋める理由とはなんなのでしょうか?


memset( rData, 0x00, sizeof(rData) ); ←これは、
単に初期化しているだけです。これをしないとバッファの中身が不定値になりますので、変な文字が受信データとして表示される場合があるからです。

rData[0] = 0x00; ←ここの事でしょうか。
受信したデータを表示させるのですが、printf( "%s", rData ); にて%sを使用した文字列表示をさせています。文字列の終端は0x00というお約束ですので、表示をかけたらループでまた表示となりますので再表示させない為に、rData[0]を0x00にする事で、無表示になります。read関数の戻り値で1以上なら表示という条件文を付けても良いのですが、簡潔にする為、単にrData[0]=0x00として無表示にさせているだけです。
    • good
    • 0
この回答へのお礼

質問が明確ではなく失礼しました(^^;
無事に理解できました!ありがとうございます!

お礼日時:2009/05/21 12:09

USB接続のRS232C(/dev/ttyUSB0)、Vine Linuxで以前作成し上手く送受信しているサンプルです。


9600Bps、8bit、ノンパリ、STOP BIT 1です。
--------------------
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>

int main( void )
{
int fd;
struct termios tio;
int err;
char sData[1];
char rData[255];

if ((fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK))<0) {
return -1;
}
memset(&tio, 0x00, sizeof(tio));
tio.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
tio.c_iflag = IGNPAR | ICRNL;
tio.c_oflag = 0;
tio.c_lflag = 0;
tio.c_cc[VTIME] = 0;
tio.c_cc[VMIN] = 1;

tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &tio);
fcntl(fd, F_SETFL, FNDELAY);

sData[0] = ' ';
memset( rData, 0x00, sizeof(rData) );
while(1){
// 1キャラクタ送信
err = write( fd, sData, 1);
sData[0]++;
if( sData[0]>='z' ){
sData[0] = ' ';
}

// 受信
err = read( fd, rData, sizeof(rData) );
printf( "%s", rData ); // 受信データ表示
rData[0] = 0x00;

// 500mSecのWAIT
usleep( 500000 );
}

close( fd );
}
--------------------
ご参考まで。
    • good
    • 0
この回答へのお礼

ありがとうございます!!参考にさせてもらいます!
ひとつ質問なのですがバッファを一度0x00で埋める理由とはなんなのでしょうか?重ね重ねすみません。

お礼日時:2009/05/21 10:56

以前の経験です。

それもLinuxではなく(昔懐かし)MS-DOSの時代の話ですから、そのぶんさっぴいでください。
あの時は読み取りだったのですが、一気にread文では読み取れず、ポートから1文字ずつ拾いました。計測器側のデータを準備するスピードとPCの読み取り速度に差異が生じ、一文字拾ったきりポート待ちになってしまいました。同様のことが発生していませんか?PC側で一気に吐き出してしまうと、計測器側で処理しきれずエラーになってしまうというものです。ほかの方も書いていますが、1文字ずつ贈ってみるのも悪くないような気がします。
    • good
    • 0
この回答へのお礼

御解答ありがとうございます!
関数を変えて1キャラクタづつ送信してみましたがうまくいきませんでした。また、PC-PC間での送信では同じPCを用いたのでそこまでの差が出るようにも思われません。当面はore100さんの指摘された点を考えていきたいと思います。ありがとうございます!!

お礼日時:2009/05/20 15:03

どのような、プロトコルで232cの通信を行うのかが不明です。


プロトコルの説明をお願い申し上げます。
ack、nacのコードが返って来ると思いますが、その処理は、ないようです。
    • good
    • 0
この回答へのお礼

さっそくの御返答ありがとうございます!
正直を言うとプロトコルの知識が全くなく今初めて調べて、それが必要であることを知りました。
つまり、制御キャラクタを処理するプログラム、及び通信プロトコルと呼ばれる通信の型?(これが前者を包括しているのかもしれませんが)をプログラムに組み込まなければならないということでよいでしょうか?
今からプロトコルの勉強をし直してきたいと思います。ありがとうございます!

お礼日時:2009/05/20 14:54

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

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

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

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

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

QC言語のゲームのサンプルプログラムが置いてあって自由に修正できるサイト教えてもらえないでしょうか?

ゲームのサンプルプログラムが置いてあって自由に修正できるサイト教えてもらえないでしょうか?

Aベストアンサー

C言語、自体があまり初心者向けではないのですが、
Cを本気で学ぼうと考えるなら、書籍を購入する事をお勧めします。

「C言語〈1〉はじめてのCプログラミング プログラミング学習シリーズ」
倉 薫 (著)
アマゾン(http://www.amazon.co.jp/)の古本で400円で販売していました。
私が昔、他の人にC言語を教えるときに使った教材ですが非常に簡単でした。
「簡単」というのがポイントで初めてCを学ぶ方から非常に読みやすいと定評があった本です。

ただこれを読んだからといってすぐに市販されているようなゲームが作れるわけではありません。
C言語でゲームを作るのはかなり地道ですし下地になる知識が相当必要です。

とりあえず市販のコンパイラ(コンパイラというのはexe等を作るやつ)は
必要になってから買うので十分です。
先に説明した無償のコンパイラで市販レベルのソフトを作る事も可能なのです。
(市販のものと何が違うかというとマニュアル、ツール、ライブラリ等が付属している点)
やろうと思えばそのツールやライブラリもその無償のコンパイラで作れるわけですから。

また前回とかぶりますが
http://www.kumei.ne.jp/c_lang/bcc/index.html
でBCCというコンパイラをインストールし
http://www.kumei.ne.jp/c_lang/index_c.html
の1章から見ていって実際もexeにして実行してみてください。
このサイトも参考になります。

C言語、自体があまり初心者向けではないのですが、
Cを本気で学ぼうと考えるなら、書籍を購入する事をお勧めします。

「C言語〈1〉はじめてのCプログラミング プログラミング学習シリーズ」
倉 薫 (著)
アマゾン(http://www.amazon.co.jp/)の古本で400円で販売していました。
私が昔、他の人にC言語を教えるときに使った教材ですが非常に簡単でした。
「簡単」というのがポイントで初めてCを学ぶ方から非常に読みやすいと定評があった本です。

ただこれを読んだからといってすぐに市販されている...続きを読む

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

QC言語・ゲーム作成で挫折気味の対処方法

こんばんは。ゲーム作成に関わらず、C言語で挫折気味の時、みなさんはどのように対処してきましたか?
以下、私の現在の状況を説明致します。

C言語でゲームを作成するという目的でC言語を勉強し、ゲーム作成の勉強をしていました。
C言語の書籍を一通り行い、DXライブラリを使用して、それに関するサイト(ゲームプログラミングの館等)を参考にしながらゲーム作成の勉強をしていました。
しかし、除々に分からなくなり、手がつけられなくなってしまいました。
ゲームを早く作成してみたいという気持ちが先走り、C言語の知恵が足りない(勉強期間:1ヶ月程度)のに
ゲーム作成に取り掛かろうとしたことがが原因のひとつだと思い、もう一度、C言語を勉強し直そうと考えています。
しかし、数ある書籍やサイトの中でどれがゲームプログラミングを学ぶのに適しているの分かりません。
みなさんがゲームプログラミングをするにあたって利用した書籍やサイトはどのようなものでしょうか?
また、同じようにC言語でゲームを作成している方にお聞きしたいのですが、C言語をどの程度勉強されてからゲーム作成に取り掛かったのでしょうか?

みなさんの意見を参考にして、勉強していきたいので、よろしければアドバイスをお願い致します。

こんばんは。ゲーム作成に関わらず、C言語で挫折気味の時、みなさんはどのように対処してきましたか?
以下、私の現在の状況を説明致します。

C言語でゲームを作成するという目的でC言語を勉強し、ゲーム作成の勉強をしていました。
C言語の書籍を一通り行い、DXライブラリを使用して、それに関するサイト(ゲームプログラミングの館等)を参考にしながらゲーム作成の勉強をしていました。
しかし、除々に分からなくなり、手がつけられなくなってしまいました。
ゲームを早く作成してみたいという気持ちが先...続きを読む

Aベストアンサー

私は、最初の頃は「SDL」を使って2Dゲームを作っていました。
その頃は、C言語は関数もあまり分かっていませんでした。
ですけど、勉強し直して「OpenGL」で3Dの簡単な動きなら動かせるようになりました。
今は作っていませんけど。

私が勉強に使った本を紹介します。
C言語の本
「図解C言語 ポインタの極意」
「新版 明解C言語 入門編」

C++言語の本
憂鬱なプログラマのためのオブジェクト指向開発講座

どのくらいC言語を理解しているか分かりませんけど、
分からないものが多く載っていて分かりやすい本を立ち読みをして、
探した方がいいと思います。

ゲームは2Dでしょうか?
それとも、3Dでしょうか?
3Dでしたら物理などが分からないと無理です。
物理の本(プログラムも載っています)
「ゲーム開発のための物理シミュレーション入門」

C++言語が分かれば、
「ゲームプログラマになる前に覚えておきたい技術」
がいいらしいです。

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

QC言語でプログラムを再起動

 UNIXで動くC言語のプログラムを作っています。
 その際、プログラムを再起動させたい時があります。
 しかし、C言語でプログラムを再起動させるってどうやればいいのかよくわかりません。
 何かよいやり方を知っている方、教えてください。
 よろしくお願いします。

Aベストアンサー

関数execl()を使えばよいと思います。
この関数は、fork()と組み合わせて、他のプログラムを
起動するのに使うのが普通ですが、
fork()せずにexecl()を呼ぶと、自プロセスを指定された
プログラムに置き換えます。ですので、ここで自分自身を
指定すれば、再起動したことになるはずです。

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つの値をこの関数に入れると、大きいほうの値が帰ることになります。

QC言語でゲーム作り

フリーゲームに影響され、自分も作ってみたいと思いC言語勉強し始めました
趣味の範囲で、こつこつ頑張っていこうと思ってます

今現在、C言語の初初心者向けの本を一通り読み終えて次の本を読んでます
一応、一つの目標としてアクションゲーム(マリオみたいな)を作りたいんですが
C言語の他にどんなこと勉強すればいいでしょうか?

あと、C言語から次のステップに移るときは
やはり上級者向けの本は理解できるくらいまで頑張ってからでしょうか?

Aベストアンサー

とりあえずCだけではなく、C++まで一通り学習することをお勧めします。
PCゲームなのかどうか、Windows上のものなのかどうかわかりませんが、C/C++系の場合は、C++使っていることが多いので、C++知っているのと知らないのとでは、サンプルだとかライブラリとか理解できないかもしれないので。

仮にWindowsアプリだとして、API叩いてGDIで描画するか、DirectXを使うかというところもありますね。
2Dの横スクロールならGDIでも可能でしょうけど、後々のことを考えるとDirectX使えるように勉強したほうが、楽だしいろいろなことができるようになります。
DirectXはC++なので、やはりC++になります。

ちょっと戻ってしまいますが、Windowsアプリを作るのであれば、CやC++言語だけではだめで、WindowsAPIを使う必要があります。
まぁ一種のライブラリだと思えばよいですけど。

とりあえず、C/C++の入門書を一通りみて、どのような文法や制約などがあるか理解し(覚えなくてOK)、実際のサンプルソースなどをいじったり改良したりして実際の動作を見ていくのがよろしいかと。
コンソールでのC/C++がある程度わかってきたら、WindowsAPIやDirectXなどの入門書を見ていくといいのではないかとおもいます

とりあえずCだけではなく、C++まで一通り学習することをお勧めします。
PCゲームなのかどうか、Windows上のものなのかどうかわかりませんが、C/C++系の場合は、C++使っていることが多いので、C++知っているのと知らないのとでは、サンプルだとかライブラリとか理解できないかもしれないので。

仮にWindowsアプリだとして、API叩いてGDIで描画するか、DirectXを使うかというところもありますね。
2Dの横スクロールならGDIでも可能でしょうけど、後々のことを考えるとDirectX使えるように勉強したほうが、楽だ...続きを読む

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む

QC言語のプログラム集

こんにちは。C言語のテキストにはプログラムとその説明が書いていますが、
このC言語のプログラムが多くのっているような本はありますか?本屋さんで探したのですが、プログラムがものすごく多くのっているようなものがなかったので、もしお分かりの方がおられましたが、本の紹介をお願いします。

Aベストアンサー

C言語ということでどうしても古い本になってしまいますが
下記URLのような本はどうでしょうか。
http://oku.edu.mie-u.ac.jp/~okumura/algo/
http://www.amazon.co.jp/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A1%E3%83%AA%E3%82%AB%E3%83%AB%E3%83%AC%E3%82%B7%E3%83%94%E3%83%BB%E3%82%A4%E3%83%B3%E3%83%BB%E3%82%B7%E3%83%BC-%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88%E2%80%95C%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8B%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E3%81%AE%E3%83%AC%E3%82%B7%E3%83%94-William-H-Press/dp/4874085601

ご参考になれば幸いです。

Qprintf("%2.d",0);は?

printf("%2.d",0);
を表示すると何も表示されません・・。
どうしたらいいのでしょうか?

Aベストアンサー

「%2.d」は「%2.0d」と同じです。

つまり「2文字の幅で、少なくとも0ケタの数字を書け」です。

この「少なくとも0ケタの数字を書け」は、言い替えれば「先頭にあるゼロは、全体が0ケタになるまで削ってよし」と言う意味です。

結果「_0」('_'は半角スペースの意味)の先頭のゼロを0ケタになるまで削るので「__」になります。

ゼロの時に「_0」と表示したいなら「%2d」と指定しましょう。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング