質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2092閲覧

c言語のsscanfを用いて読み込んだ文字列(日本語)を出力しようとすると文字化けをしてしまう

jajaja

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2019/08/17 07:55

編集2019/08/17 09:44

前提・実現したいこと

c言語でのsscanfの仕様を勉強しようとしていました。
2017.txtファイルから文字列を取得してきて表示するというプログラムです。
2017.txt内の文字列が"勝ち"のみの場合は正しく出力することができたのですが文字列を一つ増やすと文字化けが発生しました。

発生している問題・エラーメッセージ

printfの出力が�となってしまう

該当のソースコード

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define N 256 6 7int main(int argc,char *argv[]){ 8 FILE *fp; 9 char fileName[] = "2017.txt"; 10 fp = fopen(fileName,"r"); 11 if(fp == NULL) { 12 printf("%s file not open!\n", fileName); 13 return -1; 14 } 15 16 char file[N]; 17 char str1[5]; 18 char str2[5]; 19 20 fgets(file,N,fp); 21 printf("%s\n",file); 22 sscanf(file,"%s %s",str1,str2); 23 24 printf("%s\n",str1); 25 26 fclose(fp); 27 return 0; 28}

2017txt

1勝ち 負け

試したこと

2017.txt内のスペースは半角でcのsscanfの第二引数の部分のスペースも半角にしてました。

補足情報(FW/ツールのバージョンなど)

visual stdio code 1.33.1
Mac OS 10.14.5

初めて質問するため至らない点が多いと思いますが回答していただけたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

多くの日本語はUTF-8において1文字=3byteです。
したがって、

char str1[5]; char str2[5];

では足りません。

投稿2019/08/17 09:05

編集2019/08/17 10:33
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jajaja

2019/08/17 09:42

回答ありがとうございます。 日本語が3byteだということは知りませんでした。 配列の大きさを7byte以上にすることで文字化けせずに出力できることを確認しました。 追加でお伺いしたいことがあります。 "勝ち"は2文字ですので6byteかなと考え、最初str1とstr2の大きさを6byteにしたところ出力が空白になってしまいました。 配列の大きさを7byteにしたら上手く出力できたことから、 配列に格納する日本語の文字数をnとした時、格納される配列の大きさは2 * n + 1以上でなければならないと考えたのですが、この認識であっていますでしょうか。
asm

2019/08/17 10:33

終端文字(\0)が必要ですので 3*n+1以上になります。 ただし、BMP外と呼ばれる文字についてはその限りではなく4*n+1バイトになり 結合文字になってくると1文字とはなんぞや・・・という感じになってきます。
jajaja

2019/08/17 10:43

終端文字があるから+1byteしなければならないんですね。 教えていただきありがとうございました!
YA-METAL

2021/07/28 04:19

UTF-8は最大4バイトです。変更になったらしかたないね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問