アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語初心者です。宜しくお願い致します。

char ss[10];

/*【1】0ナシの文字列*/
strcpy(ss,"abcdefg");
printf("%s\n",ss);

/*【2】0アリの文字列*/
strcpy(ss,"abc0efg");
printf("%s\n",ss);

/*【3】0アリ(NULL文字アリ)の文字列*/
strcpy(ss,"abc\0efg");
printf("%s\n",ss);

【2】、【3】の文字列を最後(~fg)まで出力させるには、
どうしたら良いのでしょうか。
(0や¥0を、文字情報の一部として扱いたい場合、という意味です。)

宜しくお願い致します。

A 回答 (5件)

2番目は問題なく出力できます。

「0」はアスキーコードが48ですので、内部では48という数値で処理されています。

でも3番目は「abc」までしか表示されません。「\0」はアスキーコードが0でして、文字列の最後を示す為に利用されているからです。

単に「abc\0efg」という文字列を表示させるのが目的なら、

strcpy(ss,"abc\\0efg");

という風に「\\」を2重にすることで可能です。2重にするとバックスラッシュ(日本語環境では円マーク)は単なる文字として扱われます。
    • good
    • 0
この回答へのお礼

>「0」はアスキーコードが48ですので、内部では48という数値で処理
>「\\」を2重にすることで可能

大変よくわかりました。ありがとうございました。

お礼日時:2010/11/11 09:23

標準関数を使うなら、


・putc, putchar等で1文字ずつ出力する
・fwriteでまとめて出力する
が考えられます。

いずれにせよ、'\0'が担っていた「どこで止めるか」についての情報が別途必要になります。
・「長さ」を記録しておく。
・別の文字('\n'とか)を終端記号として使う

また、この『文字列』を扱う方法はC標準では用意されていないので、自作する必要があります。
例えば "abc\0efg" の長さを測ろうと strlen("abc\0efg") としたところで、\0の前までしか数えないので3になります。

> strcpy(ss,"abc\0efg");

とありますが、strcpyは'\0'までしかコピーしないので、そもそもssには"abc"しかコピーされません。
    • good
    • 0
この回答へのお礼

こちらでもありがとうございます。

>strcpyは'\0'までしかコピーしないので、そもそもssには"abc"しかコピーされません

なるほど、そういうことになるんですね。
これは知りませんでした。
大変勉強になりました、ありがとうございます。

お礼日時:2010/11/11 09:33

まず、文字列の終端を'\0'とするのがC言語のルールです。



そのため、【2】の
strcpy(ss,"abc0efg");
printf("%s\n",ss);
は、0が普通に文字列として処理されます。

【3】の場合には、バイナリーデータ(文字列情報を無視)として扱えばよいので、Cの標準ライブラリにある、
fread()
fwrite()
という標準入出力のバイナリーデータ用の関数を使用します。使い方はどんなC言語の参考、解説書にも記載されていますから、自信で調べてみてください。
    • good
    • 0
この回答へのお礼

>0が普通に文字列として処理されます。

うっかりしておりました。ご指摘ありがとうございます。

>【3】の場合には、バイナリーデータ(文字列情報を無視)として扱えばよい

頭の片隅に入れておきます。

お礼日時:2010/11/11 09:29

実行してみれば判りますが…【2】は普通に表示されますよ。


数字の0('0')と数値の0('\0')がごっちゃになっていませんか?
# 数字と数値は区別しましょう。

【3】はC言語の仕様ですから…そのままでは無理かと思います。
そもそも、'\0'をどのように表示したいのでしょうか?
# 環境によっては、printf("%s", NULL)で"(null)"と表示されることもありますが…。
# 【3】みたいなデータの受け渡しは…場合によっては存在しますね。
# "PATH=ほにゃらら\0USERNAME=ほげほげ\0\0"みたいな感じに。(WindowsのAPIでもそういう渡し方するものあるし)
    • good
    • 0
この回答へのお礼

>数字の0('0')と数値の0('\0')がごっちゃになっていませんか?
># 数字と数値は区別しましょう。

うっかりしておりました。
ご指摘ありがとうございます、この点については、
また改めて質問をさせていただこうと思います。

文字'0'ではなく、数値0 として質問しているつもりでしたが、
"文字列"の中に0を入れてしまっていたため、
これでは、文字'0'として解釈され、それは皆さんのご指摘通り、
そのまま0として出力されますよね。

ということで、質問文を書き直して、
改めてこの点についてだけ、質問させていただこうと思います。

回答ありがとうございました。

お礼日時:2010/11/11 09:27

【2】は普通に表示されませんか?


通常、'0'は文字情報として扱われますよ。

【3】は通常のライブラリ関数(printfとかstrcpyとか通常提供されている関数)では、そのような処理は無理でしょう。

…というかそもそも【3】のような'\0'の使い方は避けるべきです。
あくまで'\0'は文字列の終端を表すためのものですので。

もしどうしても【3】のような使い方をしたい場合は、自分で文字配列分のループを組めば良いのでしょうけど…。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。

お礼日時:2010/11/11 09:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!