【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22364

教えてください。
投稿者---高校3年(2005/08/02 03:00:50)


はじめましてこんばんは。C言語のプログラムをはじめて
まだ4日目の初心者です。ネットで掲示板を検索して
こちらの掲示板へきました。早速ですが、分からないので教えて下さい。

あるデータを取得して指定バイト数分だけ表示させる為にはどのように
プログラムを組めばよいのでしょうか?

例えば、
項目1は30バイトとして、取得した値は17バイトとした時、
ちょうど項目1の30バイト分にして値を取得したいのです。

項目1=30バイト
取得した値(17バイト)="東京都板橋区12345"となった時に、
取得した値の5の後に13バイト分のスペースを追加して30にしたい。

逆に30バイト以上の時は30バイト分の値だけとる場合も同様に教えて下さい。
こちらは、memcmp(取得した値,30)とすれば30バイトとれるのをここの
ライブラリー関数一覧にて調べましたが、取得した値が文字化けしています。
こちらの解決策も教えて下さい。

至らない質問ですいませんが、サンプルプログラムを教えて下さい。
宜しくお願い致します。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:教えてください。 22366 まきじ 2005/08/02 09:00:21
<子記事> Re:教えてください。 22367 Blue 2005/08/02 09:06:06
<子記事> Re:教えてください。 22369 かずま 2005/08/02 10:23:16


No.22366

Re:教えてください。
投稿者---まきじ(2005/08/02 09:00:21)


>項目1=30バイト
>取得した値(17バイト)="東京都板橋区12345"となった時に、
>取得した値の5の後に13バイト分のスペースを追加して30にしたい。

構造体にデータを格納して、fwrite()、fread() を使えばよい
と思います。


この投稿にコメントする

削除パスワード

No.22367

Re:教えてください。
投稿者---Blue(2005/08/02 09:06:06)


char型配列として、
> ちょうど項目1の30バイト分にして値を取得したいのです。
こちらは sprintf関数を使えば簡単です。

char buff[ 30 ];
char value[] = "C言語";
sprintf( buff, "%- 29s", value );

ここで、char型配列で文字列を表現する場合、終端文字(\0)を考慮しなければいけません。
(バイナリで30バイトで管理するなら別)
30バイト = 最大文字数29 + 終端文字数1

> 逆に30バイト以上の時は30バイト分の値だけとる場合も同様に教えて下さい。
こちらはチェックしてコピーすればいいです。

例 格納領域が7バイト(最大文字数6)の場合

int length, size;
char buff[ 7 ];
char value[] = "C言語入門";

length = strlen( value );
size = sizeof( buff );

if ( length <= size )
{
    strncpy( buff, value, size - 1 );
    buff[ size - 1 ] = '\0';
}



この投稿にコメントする

削除パスワード

No.22369

Re:教えてください。
投稿者---かずま(2005/08/02 10:23:16)


「教えてください」というのは題名として不適切です。
また別の質問をするときも「教えてください」ですか?
本屋で、すべての本の題名が「読んでください」だと困るでしょう。
食道で、メニューの項目がすべて「食べてください」だと困るでしょう。
題名は、内容を表すものにしましょう。
今回だと、例えば「指定バイト数分だけ表示」などでよいでしょう。

さて、char data[] = "東京都板橋区12345"; int n = 30; というデータが
あって、表示だけなら、printf("%-*.*s", n, n, data);
char data2[31] に入れたいのなら、printf(data2, "%-30.30s", data);

ただ、長い文字列を短縮するとき、漢字などの 2バイト文字の途中で切らない
ようにしないといけなくて、これを考慮するには、文字コードや locale の
知識が必要になります。



この投稿にコメントする

削除パスワード

No.22370

Re:教えてください。
投稿者---Blue(2005/08/02 10:34:33)


> char data2[31] に入れたいのなら、printf(data2, "%-30.30s", data);
sprintfですね。

書式指定文字列を"%-30.30s"にすれば一発でしたね。
> 漢字などの 2バイト文字の途中で切らないようにしないといけなくて
を考えると、やはり長さのチェックは別でやらないといけないですね。



この投稿にコメントする

削除パスワード

No.22381

Re:教えてください。
投稿者---かずま(2005/08/03 02:50:27)


> sprintfですね。

すみません。
やっぱり、いつもやっているように、プログラムをちゃんと書いてコンパイル
しないとダメだということですね。

他には、「食堂」と書くべきところを「食道」と書いたりしていますね。


最初の質問者にお尋ねします。あなたの環境は何ですか?

Windoow なら、文字コードを Shift-JIS に限定してしてサンプルコードを書いて
もいいですし、setlocale() や mblen() の使える環境なら、EUC と Shift-JIS
の両方に対応したコードも書けます。


この投稿にコメントする

削除パスワード

No.22394

Re:教えてください。
投稿者---高校3年(2005/08/03 13:50:13)


何とか解決できました。
皆さん色々ありがとう御座いました。


この投稿にコメントする

削除パスワード

No.22411

Re:教えてください。
投稿者---かずま(2005/08/04 03:05:20)


> 何とか解決できました。

どんな風に解決したんですか?

"東京都板橋区二丁目4-6ライオンズプラザ板橋402"
"東京都板橋区三丁目23-7ニューシティ板橋711"
というデータなら、結果はどうなりますか?


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧