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を、文字情報の一部として扱いたい場合、という意味です。)
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
2番目は問題なく出力できます。
「0」はアスキーコードが48ですので、内部では48という数値で処理されています。でも3番目は「abc」までしか表示されません。「\0」はアスキーコードが0でして、文字列の最後を示す為に利用されているからです。
単に「abc\0efg」という文字列を表示させるのが目的なら、
strcpy(ss,"abc\\0efg");
という風に「\\」を2重にすることで可能です。2重にするとバックスラッシュ(日本語環境では円マーク)は単なる文字として扱われます。
>「0」はアスキーコードが48ですので、内部では48という数値で処理
>「\\」を2重にすることで可能
大変よくわかりました。ありがとうございました。
No.5
- 回答日時:
標準関数を使うなら、
・putc, putchar等で1文字ずつ出力する
・fwriteでまとめて出力する
が考えられます。
いずれにせよ、'\0'が担っていた「どこで止めるか」についての情報が別途必要になります。
・「長さ」を記録しておく。
・別の文字('\n'とか)を終端記号として使う
また、この『文字列』を扱う方法はC標準では用意されていないので、自作する必要があります。
例えば "abc\0efg" の長さを測ろうと strlen("abc\0efg") としたところで、\0の前までしか数えないので3になります。
> strcpy(ss,"abc\0efg");
とありますが、strcpyは'\0'までしかコピーしないので、そもそもssには"abc"しかコピーされません。
こちらでもありがとうございます。
>strcpyは'\0'までしかコピーしないので、そもそもssには"abc"しかコピーされません
なるほど、そういうことになるんですね。
これは知りませんでした。
大変勉強になりました、ありがとうございます。
No.4
- 回答日時:
まず、文字列の終端を'\0'とするのがC言語のルールです。
そのため、【2】の
strcpy(ss,"abc0efg");
printf("%s\n",ss);
は、0が普通に文字列として処理されます。
【3】の場合には、バイナリーデータ(文字列情報を無視)として扱えばよいので、Cの標準ライブラリにある、
fread()
fwrite()
という標準入出力のバイナリーデータ用の関数を使用します。使い方はどんなC言語の参考、解説書にも記載されていますから、自信で調べてみてください。
>0が普通に文字列として処理されます。
うっかりしておりました。ご指摘ありがとうございます。
>【3】の場合には、バイナリーデータ(文字列情報を無視)として扱えばよい
頭の片隅に入れておきます。
No.3
- 回答日時:
実行してみれば判りますが…【2】は普通に表示されますよ。
数字の0('0')と数値の0('\0')がごっちゃになっていませんか?
# 数字と数値は区別しましょう。
【3】はC言語の仕様ですから…そのままでは無理かと思います。
そもそも、'\0'をどのように表示したいのでしょうか?
# 環境によっては、printf("%s", NULL)で"(null)"と表示されることもありますが…。
# 【3】みたいなデータの受け渡しは…場合によっては存在しますね。
# "PATH=ほにゃらら\0USERNAME=ほげほげ\0\0"みたいな感じに。(WindowsのAPIでもそういう渡し方するものあるし)
>数字の0('0')と数値の0('\0')がごっちゃになっていませんか?
># 数字と数値は区別しましょう。
うっかりしておりました。
ご指摘ありがとうございます、この点については、
また改めて質問をさせていただこうと思います。
文字'0'ではなく、数値0 として質問しているつもりでしたが、
"文字列"の中に0を入れてしまっていたため、
これでは、文字'0'として解釈され、それは皆さんのご指摘通り、
そのまま0として出力されますよね。
ということで、質問文を書き直して、
改めてこの点についてだけ、質問させていただこうと思います。
回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- マウス・キーボード 中2でタイピングで10分間に1200文字は遅いほうですか? 1 2022/08/10 14:55
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
C言語、単語ごとに改行したい
-
文字列中に含まれる文字の個数...
-
Cで「大文字、小文字の判定」は...
-
charと%c , %s の関係について
-
sscanfとscanfの違いがよくわか...
-
文字列の途中に「0」がある場...
-
C言語のステップ数をカウントす...
-
エディットボックスに入力され...
-
[Java]文字列分割
-
ある文字列で2回目3回目に出現...
-
日本語の変換の問題
-
教えていただけませんか?C言語...
-
CStringについて
-
itoaわかりません
-
C言語の問題 キーボードから1 ...
-
スペースで区切って数字を入力
-
getchar分を用いて入力された文...
-
文の意味
-
C言語 空白の行(改行のみ)が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
反転した数値を表示させるやり方
-
fgetsで拾われる改行文字を削除...
-
C言語 空白の行(改行のみ)が...
-
itoaわかりません
-
Cで「大文字、小文字の判定」は...
-
文字列中に含まれる文字の個数...
-
C言語で16進数文字列から16進数...
-
strstrを利用しない文字列検索...
-
小文字のみを数える方法
-
C言語のステップ数をカウントす...
-
C言語でパスワード作成ツール
-
単語数のカウントについて
-
str[j++]の意味
-
fgetsでバッファ残留文字列を無...
-
教えていただけませんか?C言語...
-
エディットボックスに入力され...
おすすめ情報