C言語なら俺に聞け(入門篇) Part 54

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2009/10/29(木) 11:10:07
>>951
sprintf(Buf, "123,456\0"+4);
953デフォルトの名無しさん:2009/10/29(木) 11:12:24
char Buf[10];
char *str = "123,456\0";
int start = 5;
int end = 7;
sprintf(Buf, "%.*s", end - start + 1, str + start - 1);
954デフォルトの名無しさん:2009/10/29(木) 11:24:15
速やか過ぎる返信ありがとうございます。

>>952のも>>953のもどちらも実行結果は正しいのですが
肝心の何故こうなるのかが理解できてません。ダメジャンorz

>>952の方のはsprintf関数の挙動を調べればなんとなく分かりそうなのですが(文字列操作に+4って何事?状態)
>>953のお方のは正直何が起こっているのかさっぱりです。ポイン・・・タ・・・?

とにかくとっかかりは掴めたのでもう少し調べてみようと思います。ありがとうございました
955デフォルトの名無しさん:2009/10/29(木) 11:27:00
Buf+4 は &Buf[4] と同じ・・・ と言ってもわからないだろうか?
正直、ポインタの理解なしに文字列操作は厳しいと思う
956デフォルトの名無しさん:2009/10/29(木) 11:32:45
>>955
>Buf+4 は &Buf[4] と同じ
だということを今知ったレベルでした。
ポインタはなんとなーく概念的にはつかんでいるものの使いこなすには至らず逃げてばかりだったので…
ネットワーク間でデータをやりとりしたいため文字列操作に手を出さざるを得なくなったのですが
ポインタの基礎から把握していないと駄目っぽいですね…
957953:2009/10/29(木) 11:37:57
こう書けば読めたりするだろうか。

char str[10];
strcpy(str, "123,456");
sprintf(Buf, "%.3s", str[5-1]); /* 5文字目の添え字は4 */
958951:2009/10/29(木) 11:47:59
>>957
お恥ずかしながらフォーマット指定子で .[整数] ってなんだっけ…レベルです。
そして%sでstr[4]を指定すると何故5文字目以降が参照されるのかもしっかり把握していません。

後者は
sprintf(Buf,"%s",str);
は str[0]から\0にぶつかるまで参照していたということなのでしょうか。

とにかく、今やってみたおかげで>>957に類するコードを入力したら
何故かは知らないけどこうなる!というのが分かる状態になりました…
がそんなんでは使いものになりませんよね
959デフォルトの名無しさん:2009/10/29(木) 11:52:29
>>958
プログラムは向いていない。
960デフォルトの名無しさん:2009/10/29(木) 11:53:18
そもそも"123,456\0"と言う風に'\0'を文字列リテラルに入れている時点で文字列操作を理解していないことが判るじゃないか。
961デフォルトの名無しさん:2009/10/29(木) 12:02:16
悔しいけども正論過ぎて泣いた。

本なりサイトなりで勉強し直すのが一番早そうですね。
丁寧に教えて下さった方、ありがとうございました。

\0を手動で入れていたのは、
ネットワークから送り込まれてくるデータがバッファに際限なく溜まっていってしまうため
区切りとして入れたのですがきっとそんなことになってしまう時点で何かがおかしいんですねわかります。
962953:2009/10/29(木) 12:08:20
>>958
%[整数1].[整数2]s
と書くと、最低でも[整数1]幅、最大でも[整数2]幅という指定になる
最低幅に足りない場合は先頭にスペースが埋められ、最大幅を超えた部分は切り捨てられる。

ネットワーク間でのデータやりとりだと、最大幅に足りない場合は後ろにスペースを埋めたいという
ニーズもあるかと思う。
その場合は
%-[整数1].[整数2]s
とすればいい。

そのうち慣れるからがんばれ。
963デフォルトの名無しさん:2009/10/29(木) 12:15:15
>>961
ネットワークから流れてくるものは文字列ではない。あれは只のバイト列だ。
と言う意識がないといつまでもカスみたいなコードしか書けないよ。
# 某SIerのプロパーがまさしくそれなんだが……
神経質な人は、文字列で扱うときはcharでバイト列として扱うときは(unsigned charをtypedefした)BYTEにしているくらいだ。
# それはそれで、文字列系の標準関数を使うたびにキャストする必要があるので時としてあれだけど。
964デフォルトの名無しさん:2009/10/29(木) 12:18:29
>>961
?
バッファに際限なくたまるというのは確かにそうなってる時点でなんか変だと思う。
recv近辺のコードを上げてくれたらなんか分かるかも。
965951:2009/10/29(木) 12:27:47
>>963
なるほど、覚えておくと見やすくなるだけでなく色々活用できるんですねえ…

>>963
今まで平気で文字列として扱ってきたのですがバイトだったのですか!
…それを知ったところで今すぐ何かが変わるわけじゃないのが不勉強なところですが
保存したレスをいつか発掘したら意味がちゃんと分かるようになってるといいなあ…

>>964
相談したいのは山々なのですが
ネットワーク周りはDXライブラリの関数を使用しているので
ここだとスレ違いな気がするのです。
966デフォルトの名無しさん:2009/10/29(木) 12:40:43
>>965
念の為に捕捉。
>963は、ナル文字で終端されていることがはっきりしている場合を文字列と言っている。
終端されていないものにはstrlen()やstrcpy()などの関数が使えないから、意識しておかないとね。
だからと言って、受信バッファより多めにメモリを確保して事前にクリアするなんてのは下策。
尚sprintf()の場合は、>962にあるようにサイズ制限ができるからバイト列に対しても使えなくはない。
967デフォルトの名無しさん:2009/10/29(木) 12:46:22
>>966
> >>963は、ナル文字で終端されていることがはっきりしている場合を文字列と言っている。
別に>>963がどうとかじゃないよね。
Cにおける文字列の定義の話でしょ。
968デフォルトの名無しさん:2009/10/29(木) 13:02:58
>>967
異論避け。それほど他意はない。
969デフォルトの名無しさん:2009/10/29(木) 14:38:26
1から40までの数のなかで、3がつく数字とさんの倍数をすべて表示するプログラムを教えてください。
970デフォルトの名無しさん:2009/10/29(木) 14:43:03
>>969
puts("3 6 9 12 13 15 18 21 23 24 27 30 31 32 33 34 35 36 37 38 39");
971デフォルトの名無しさん:2009/10/29(木) 14:44:44
>>969
#include <stdio.h>
#include <string.h>
int main(void) {
  int i;
  char buf[32];
  for(i = 1; i <= 40; i++) {
    sprintf(buf, "%d", i);
    if (i % 3 == 0 || strchr(buf, '3') != NULL) {
      printf("%d\n", i);
    }
  }
  return 0;
}
972デフォルトの名無しさん:2009/10/29(木) 15:59:09
#define _XOPEN_SOURCE
#include <stdio.h>
#include <unistd.h>
int main()
{
char a[100];

*a = crypt("hogehoge", "EV");
printf("%s", a);

return 0;
}
crypt関数について調べようと思ってこんなん作ったんだけどaに何も入らないのはなぜ?
crypt関数自体がアレなのかなと思って
int main()
{
char a[100];

  printf("%s", crypt("hogehoge", "EV"));

return 0;
}
を試しに実行してみたけどこれはまともに動いた。
973デフォルトの名無しさん:2009/10/29(木) 16:12:20
gcc -Wall
974デフォルトの名無しさん:2009/10/29(木) 16:19:50
>>972
char a[100]; の時、a は &a[0] と同じ
つまり、*a はa[0]と同じ
a[0] = crypt・・・
が変なのはわかるだろ。
strcpy使え。
975デフォルトの名無しさん:2009/10/29(木) 16:22:14
*a = crypt("hogehoge", "EV");

a[0] = (char)crypt("hogehoge", "EV");
と同じ
976デフォルトの名無しさん:2009/10/29(木) 16:49:46
C言語学びはじめてもうすぐ半年になるが、いつになったらタッチタイピングできるようになるんだ
977デフォルトの名無しさん:2009/10/29(木) 16:57:47
>>976
英語配列に変えてみた、、がまだ慣れない。
978デフォルトの名無しさん:2009/10/29(木) 17:53:51
>>976
プログラミングとタッチタイピングを同時に学ぼうと言うのがそもそも間違い。
プログラミングは、基本的にキー入力速度が速い必要はないからね。
979デフォルトの名無しさん:2009/10/29(木) 18:11:08
どうせなら C でタイピング練習ゲーム作ったらどうか。
980デフォルトの名無しさん:2009/10/29(木) 20:11:55
ビット演算について質問です
char aの上位4バイトに 64以下の整数char bを代入したい場合、
(a & 0b00001111) +  (b << 4)
でできるのはわかるのですが、
もっと単純な表記方法はあるでしょうか?
981デフォルトの名無しさん:2009/10/29(木) 20:14:17
ゲームセンターにあるタイピングオブザデッドに憧れてタイピング練習しはじめて
ローマ字覚える前にタッチタイピングマスターしちまったなぁ
最近出た第二弾はわからんがタイピング覚える気ならゾンビ打マジおすすめ
本当の意味でゲーム感覚で覚えられるタイピングソフト
他にもいろいろタイピングソフトやってみたがまともなのはこれしかなかった
スレチごめんね
982デフォルトの名無しさん:2009/10/29(木) 20:17:20
環境によっては
union {struct {unsigned ah:4; unsigned al:4} s; char c} a;
として
a.s.ah = b;
と書ける。
或いは、
a = (a % 16) + (b * 16);
とも書ける。
いずれの場合も、bが16以上の場合は破綻する。
983デフォルトの名無しさん:2009/10/29(木) 20:18:43
>>980
>char aの上位4バイトに 64以下の整数char bを代入したい場合、
char aの上位4ビットに 15以下の整数char bを代入したい場合、

の書き間違いかな?
984デフォルトの名無しさん:2009/10/29(木) 20:19:17
>>980
charの上位4バイトってなんだよpgr
985980:2009/10/29(木) 20:19:56
>982
どうも
4ビットって64じゃなくて16でしたね…
こんなんでビット演算とかやらない方が安全か
986デフォルトの名無しさん:2009/10/29(木) 21:11:02 BE:284013465-DIA(352353)
次スレ立てました
C言語なら俺に聞け(入門篇) Part 55
http://pc12.2ch.net/test/read.cgi/tech/1256818218/
987デフォルトの名無しさん:2009/10/29(木) 22:10:01
>>985

「こんなんで・・・」はないと思うぞ。
1ビットでも必要な時はビット演算をする。

そもそも何のためにやるのかだよね。
988デフォルトの名無しさん:2009/10/29(木) 23:37:27
>>957
989デフォルトの名無しさん:2009/10/29(木) 23:47:58
屁こくな
990デフォルトの名無しさん:2009/10/29(木) 23:52:11
間違いの指摘するならちゃんと教えてやれよ。
まあ、うっかりミスだろうから指摘するまでもないが。
991デフォルトの名無しさん:2009/10/30(金) 00:56:33
>>982
そのunionの使い方って厳密には保証されないんじゃないっけ?
992デフォルトの名無しさん:2009/10/30(金) 00:58:54
俺にはその間違い探し難しすぎるぜ
993デフォルトの名無しさん:2009/10/30(金) 08:44:31
>>991
上下どちらのビットから割り付けるかは処理系定義なので
移植性はないけどもどっちかに決まっているはず。
994デフォルトの名無しさん:2009/10/30(金) 09:46:08
ume
995デフォルトの名無しさん:2009/10/30(金) 09:50:06
>>991
処理系によっては、妙な割り付け方をするかもしれないね。
996デフォルトの名無しさん:2009/10/30(金) 10:02:19
ume
997デフォルトの名無しさん:2009/10/30(金) 10:04:35
age
998デフォルトの名無しさん:2009/10/30(金) 10:18:54
>>992
>957のことなら、& str[5 - 1]だ。
999デフォルトの名無しさん:2009/10/30(金) 10:18:59
ume
1000デフォルトの名無しさん:2009/10/30(金) 10:21:41
03e8
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。