>>951 sprintf(Buf, "123,456\0"+4);
char Buf[10];
char *str = "123,456\0";
int start = 5;
int end = 7;
sprintf(Buf, "%.*s", end - start + 1, str + start - 1);
速やか過ぎる返信ありがとうございます。
>>952のも
>>953のもどちらも実行結果は正しいのですが
肝心の何故こうなるのかが理解できてません。ダメジャンorz
>>952の方のはsprintf関数の挙動を調べればなんとなく分かりそうなのですが(文字列操作に+4って何事?状態)
>>953のお方のは正直何が起こっているのかさっぱりです。ポイン・・・タ・・・?
とにかくとっかかりは掴めたのでもう少し調べてみようと思います。ありがとうございました
Buf+4 は &Buf[4] と同じ・・・ と言ってもわからないだろうか?
正直、ポインタの理解なしに文字列操作は厳しいと思う
>>955 >Buf+4 は &Buf[4] と同じ
だということを今知ったレベルでした。
ポインタはなんとなーく概念的にはつかんでいるものの使いこなすには至らず逃げてばかりだったので…
ネットワーク間でデータをやりとりしたいため文字列操作に手を出さざるを得なくなったのですが
ポインタの基礎から把握していないと駄目っぽいですね…
957 :
953:2009/10/29(木) 11:37:57
こう書けば読めたりするだろうか。
char str[10];
strcpy(str, "123,456");
sprintf(Buf, "%.3s", str[5-1]); /* 5文字目の添え字は4 */
958 :
951:2009/10/29(木) 11:47:59
>>957 お恥ずかしながらフォーマット指定子で .[整数] ってなんだっけ…レベルです。
そして%sでstr[4]を指定すると何故5文字目以降が参照されるのかもしっかり把握していません。
後者は
sprintf(Buf,"%s",str);
は str[0]から\0にぶつかるまで参照していたということなのでしょうか。
とにかく、今やってみたおかげで
>>957に類するコードを入力したら
何故かは知らないけどこうなる!というのが分かる状態になりました…
がそんなんでは使いものになりませんよね
そもそも"123,456\0"と言う風に'\0'を文字列リテラルに入れている時点で文字列操作を理解していないことが判るじゃないか。
悔しいけども正論過ぎて泣いた。
本なりサイトなりで勉強し直すのが一番早そうですね。
丁寧に教えて下さった方、ありがとうございました。
\0を手動で入れていたのは、
ネットワークから送り込まれてくるデータがバッファに際限なく溜まっていってしまうため
区切りとして入れたのですがきっとそんなことになってしまう時点で何かがおかしいんですねわかります。
962 :
953:2009/10/29(木) 12:08:20
>>958 %[整数1].[整数2]s
と書くと、最低でも[整数1]幅、最大でも[整数2]幅という指定になる
最低幅に足りない場合は先頭にスペースが埋められ、最大幅を超えた部分は切り捨てられる。
ネットワーク間でのデータやりとりだと、最大幅に足りない場合は後ろにスペースを埋めたいという
ニーズもあるかと思う。
その場合は
%-[整数1].[整数2]s
とすればいい。
そのうち慣れるからがんばれ。
>>961 ネットワークから流れてくるものは文字列ではない。あれは只のバイト列だ。
と言う意識がないといつまでもカスみたいなコードしか書けないよ。
# 某SIerのプロパーがまさしくそれなんだが……
神経質な人は、文字列で扱うときはcharでバイト列として扱うときは(unsigned charをtypedefした)BYTEにしているくらいだ。
# それはそれで、文字列系の標準関数を使うたびにキャストする必要があるので時としてあれだけど。
>>961 ?
バッファに際限なくたまるというのは確かにそうなってる時点でなんか変だと思う。
recv近辺のコードを上げてくれたらなんか分かるかも。
965 :
951:2009/10/29(木) 12:27:47
>>963 なるほど、覚えておくと見やすくなるだけでなく色々活用できるんですねえ…
>>963 今まで平気で文字列として扱ってきたのですがバイトだったのですか!
…それを知ったところで今すぐ何かが変わるわけじゃないのが不勉強なところですが
保存したレスをいつか発掘したら意味がちゃんと分かるようになってるといいなあ…
>>964 相談したいのは山々なのですが
ネットワーク周りはDXライブラリの関数を使用しているので
ここだとスレ違いな気がするのです。
>>965 念の為に捕捉。
>963は、ナル文字で終端されていることがはっきりしている場合を文字列と言っている。
終端されていないものにはstrlen()やstrcpy()などの関数が使えないから、意識しておかないとね。
だからと言って、受信バッファより多めにメモリを確保して事前にクリアするなんてのは下策。
尚sprintf()の場合は、>962にあるようにサイズ制限ができるからバイト列に対しても使えなくはない。
>>966 >
>>963は、ナル文字で終端されていることがはっきりしている場合を文字列と言っている。
別に
>>963がどうとかじゃないよね。
Cにおける文字列の定義の話でしょ。
969 :
デフォルトの名無しさん:2009/10/29(木) 14:38:26
1から40までの数のなかで、3がつく数字とさんの倍数をすべて表示するプログラムを教えてください。
>>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;
}
#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;
}
を試しに実行してみたけどこれはまともに動いた。
gcc -Wall
>>972 char a[100]; の時、a は &a[0] と同じ
つまり、*a はa[0]と同じ
a[0] = crypt・・・
が変なのはわかるだろ。
strcpy使え。
*a = crypt("hogehoge", "EV");
は
a[0] = (char)crypt("hogehoge", "EV");
と同じ
C言語学びはじめてもうすぐ半年になるが、いつになったらタッチタイピングできるようになるんだ
>>976 英語配列に変えてみた、、がまだ慣れない。
>>976 プログラミングとタッチタイピングを同時に学ぼうと言うのがそもそも間違い。
プログラミングは、基本的にキー入力速度が速い必要はないからね。
どうせなら C でタイピング練習ゲーム作ったらどうか。
ビット演算について質問です
char aの上位4バイトに 64以下の整数char bを代入したい場合、
(a & 0b00001111) + (b << 4)
でできるのはわかるのですが、
もっと単純な表記方法はあるでしょうか?
ゲームセンターにあるタイピングオブザデッドに憧れてタイピング練習しはじめて
ローマ字覚える前にタッチタイピングマスターしちまったなぁ
最近出た第二弾はわからんがタイピング覚える気ならゾンビ打マジおすすめ
本当の意味でゲーム感覚で覚えられるタイピングソフト
他にもいろいろタイピングソフトやってみたがまともなのはこれしかなかった
スレチごめんね
環境によっては
union {struct {unsigned ah:4; unsigned al:4} s; char c} a;
として
a.s.ah = b;
と書ける。
或いは、
a = (a % 16) + (b * 16);
とも書ける。
いずれの場合も、bが16以上の場合は破綻する。
>>980 >char aの上位4バイトに 64以下の整数char bを代入したい場合、
char aの上位4ビットに 15以下の整数char bを代入したい場合、
の書き間違いかな?
>>980 charの上位4バイトってなんだよpgr
985 :
980:2009/10/29(木) 20:19:56
>982
どうも
4ビットって64じゃなくて16でしたね…
こんなんでビット演算とかやらない方が安全か
>>985 「こんなんで・・・」はないと思うぞ。
1ビットでも必要な時はビット演算をする。
そもそも何のためにやるのかだよね。
屁こくな
間違いの指摘するならちゃんと教えてやれよ。
まあ、うっかりミスだろうから指摘するまでもないが。
>>982 そのunionの使い方って厳密には保証されないんじゃないっけ?
俺にはその間違い探し難しすぎるぜ
>>991 上下どちらのビットから割り付けるかは処理系定義なので
移植性はないけどもどっちかに決まっているはず。
ume
>>991 処理系によっては、妙な割り付け方をするかもしれないね。
ume
997 :
デフォルトの名無しさん:2009/10/30(金) 10:04:35
age
>>992 >957のことなら、& str[5 - 1]だ。
ume
1000 :
デフォルトの名無しさん:2009/10/30(金) 10:21:41
03e8
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。