yaottiの日記

 | 

2008-05-30

Cのかきかた

23:22

とりあえず動くんだけど妥当な書き方なのかわからんので貼ってみる。

「ここ変な書き方してるよ!!」とか突っ込み入れてもらえると嬉しいです。

forまわりとか配列初期化とか。(そもそも配列て使うまえに初期化すべきなのか



mainの中に定数入れちゃってるのはキニシナイ

K&R 3-2
改行文字やタブ文字を\nや\tという文字そのものに変えてコピーする関数escape(s, t)を書け

//参照しないなら初期化は不要(@t33f)

//するなら'\0'で(@tyoro)

//これだとtの10,12,14,16,18が初期化されない(id:Kiyoya)

#include <stdio.h>

int escape(int s[], int t[]);

int main(int argc, char *argv[])
{
    int i, j;
    int s[10], t[20];

/*
    for (i = j = 0; i < 10; ++i, ++j)
	s[i] = t[i] = t[++j] = 0;
        //初期化するならこっち(×)
	s[i] = t[i] = t[j*2] = 0;

*/    
    printf("type characters less than 10.\n");
    i = 0;
    while((s[i++] = getchar()) != EOF)
	;
    if(!escape(s, t))
	printf("the length of first arg is too long!!\n");
    for (i = 0; t[i] != EOF; ++i)
	printf("%c",t[i]);
    printf("\nend\n");
    return 0;
}


int escape(int s[], int t[]) {
    int i, j;
    /* 5/31 00:24追記 */
    /* 逆… */
    /* コピー元よりコピー先が小さいときにエラーという意図 */
    //if (sizeof(s) < sizeof(t)) {    
    if (sizeof(s) > sizeof(t)) {
    	return 0;
    }
    for (i = j = 0; s[i]; ++i, ++j) {
	switch (s[i]) {
	case '\t':
	    t[j++] = '\\';
	    t[j] = 't';
	    break;
	case '\n':
	    t[j++] = '\\';
	    t[j] = 'n';
	    break;
	default:
	    t[j] = s[i];
	    break;
	}
    }
    return 1;
}

KiyoyaKiyoya2008/05/30 23:37s[i] = t[i] = t[++j] = 0; って、sとtの初期化をやってるんだよね?
これだとtの10,12,14,16,18が初期化されないような。

fd0fd02008/05/30 23:41escape() 内の sizeof(s) < sizeof(t) の意図は何でしょう?
常に false になる気がします。

KiyoyaKiyoya2008/05/30 23:44sizeof(s) < sizeof(t) は常にtrueかな。でも趣旨としては sizeof(s) * 2 == sizeof(t) とかの方が良いような。

jj1bdxjj1bdx2008/05/30 23:51そもそも文字列は char の配列にすべき

条件判定と ++ 演算子は分けないと混乱する

for ( i = j = 0, ... → for ( i = 0, j = 0, ...

if, while や for では面倒でも {} を使え

main()からは return しないで exit() を使うべし

この手の文字列処理はそもそも配列じゃなくてポインタで書いたほうが後々楽

文字列関連のstrncpy()とか参考にすべし

yuyarinyuyarin2008/05/30 23:53常にfalseです>int escape(int s[], int t[]) { if (sizeof(s) < sizeof(t)) {

KiyoyaKiyoya2008/05/30 23:55>常にfalse
あ、そうか。これ引数で渡してるんだ。
CこわいよC。

hajimepghajimepg2008/05/31 00:35ついったーから来ました。
自分なりに書いてみました。

http://blog.studiohff.net/200805/post_358.html

tsupotsupo2008/05/31 03:19フォローアップ記事を書きました。
http://watcher.moe-nifty.com/memo/2008/05/re_c_38b6.html

jj1bdxjj1bdx2008/05/31 07:31難読化したコードを残しておくのもいまいちだし,かつ s と t の扱いが逆だったので,課題通りに直したコードを記事にして置いておきました.この手のことって,意外に書籍にはちゃんと書かれてないですねえ.

http://d.hatena.ne.jp/jj1bdx/20080531/p1

SymonaSymona2011/05/07 14:26Home run! Great sulggnig with that answer!

hskoqjdweuthskoqjdweut2011/05/08 11:11LwgaMx <a href="http://ywjxuypqzgfg.com/">ywjxuypqzgfg</a>

wnqjitlpakkwnqjitlpakk2011/05/09 12:53uZJyjf , [url=http://gpdpisvjdgva.com/]gpdpisvjdgva[/url], [link=http://yfmqvnytsefu.com/]yfmqvnytsefu[/link], http://iolvtroboyje.com/

wgkhlnhzwgkhlnhz2011/05/10 12:27efTMcK <a href="http://kruppvhavcei.com/">kruppvhavcei</a>

mkypjjmkypjj2011/05/15 11:26OmdmsQ , [url=http://jdhawrzxzdpq.com/]jdhawrzxzdpq[/url], [link=http://pljegvxkfjwo.com/]pljegvxkfjwo[/link], http://zzhagljzundl.com/

 |