|
|
||
twitterやコメントでたくさん反応をもらったので書き直しました。
ありがとうございます。
格納する変数はintではなくcharで。
K&Rは今のとこ全部intで処理してるな…なんでだろ。
あと本ではポインタが出てきていないので一応配列で書きました。
でも仮引数に配列はよくないみたい。
参考:
http://blog.studiohff.net/200805/post_358.html
http://d.hatena.ne.jp/yuyarin/20080531/1212161875
#include <stdio.h> #include <stdlib.h> /* 読み込む最大の長さ */ #define MAX_INPUT_LENGTH 10 void escape(char s[], char t[]); int main(int argc, char *argv[]) { int i, j; char s[MAX_INPUT_LENGTH+1], t[MAX_INPUT_LENGTH*2+1]; printf("type characters less than %d.\n", MAX_INPUT_LENGTH); /* printf("size:%d\n", sizeof(s)/sizeof(char)); */ /* ->11 */ /* EOFに到達するorMAX_INPUT_LENGTH分まで読む */ i = 0; while((s[i] = getchar()) != EOF && i < MAX_INPUT_LENGTH) { ++i; } /* 文字列の最後 */ s[i] = '\0'; escape(s, t); printf("%s",t); printf("\nend\n"); exit(0); } void escape(char s[], char t[]) { int i, j; /* printf("s: %d, t: %d\n", sizeof(s), sizeof(t)); */ /* -> s: 4, t: 4 */ /* 仮引数を配列にしていてもポインタ扱い */ for (i = 0, j = 0; s[i] != '\0'; ++i) { switch (s[i]) { case '\t': /* strcpyを使った方がきれいに書ける */ /* 追記 */ /* strcpy→strcat */ t[j++] = '\\'; t[j++] = 't'; break; case '\n': t[j++] = '\\'; t[j++] = 'n'; break; default: t[j++] = s[i]; break; } } /* 文字列の最後 */ t[j] ='\0'; }
これでよいかな。
C/C++ ではポインタや配列を関数に渡す際には必ず一緒にサイズを渡すようにする、というのが習慣になってるからなあ。
ほほう。
これだとtの10,12,14,16,18が初期化されないような。
常に false になる気がします。
条件判定と ++ 演算子は分けないと混乱する
for ( i = j = 0, ... → for ( i = 0, j = 0, ...
if, while や for では面倒でも {} を使え
main()からは return しないで exit() を使うべし
この手の文字列処理はそもそも配列じゃなくてポインタで書いたほうが後々楽
文字列関連のstrncpy()とか参考にすべし
あ、そうか。これ引数で渡してるんだ。
CこわいよC。
自分なりに書いてみました。
http://blog.studiohff.net/200805/post_358.html
http://watcher.moe-nifty.com/memo/2008/05/re_c_38b6.html
http://d.hatena.ne.jp/jj1bdx/20080531/p1