#8
by かずま » 6年前
Timi116 さんが書きました: ↑6年前
そちらのコード試してみたのですが、エラーは出なかったのですが、文字が出力されませんでした。
どんな入力を与えたのですか?
不具合を報告するときは、具体的な情報を示してください。
入力のすべての文字が出力されなかったのか、
半角の - や " が出力されなかったのか、などを含めて。
元のプログラムのダメだった理由は、char が 1バイトだからです。
通常の半角文字は1バイトですが、全角文字は 2~3バイトになります。
そして、fgetc は、1バイトを読み込む関数です。
次のテストプログラムでどのように表示されますか?
コード:
#include <stdio.h>
int main(void)
{
const char s[] = """;
unsigned char c;
for (const char *p = s; c = *p; p++) printf(" %02x", c);
putchar('\n');
printf("%08x\n", '"');
printf("%04x\n", L'"');
}
私は次のような結果を予想しています。
コード:
ef bc 82
00efbc82
ff02
さて、wchar_t を使ってだめなら、次のコードはどうでしょうか?
コード:
#include <stdio.h> // printf, scanf, fgets, fputs
#include <string.h> // strncmp, memcpy
int mb_len(const char *p)
{
unsigned char b = *p;
if (b < 0x80) return 1;
if (b < 0xe0) return 2;
if (b < 0xf0) return 3;
if (b < 0xf8) return 4;
if (b < 0xfc) return 5;
return 6;
}
int main()
{
char filename[FILENAME_MAX];
FILE *fp;
char s1[1024], s2[1024];
int len1 = mb_len("-");
int len2 = mb_len(""");
printf("ファイル名を入力してください:");
scanf("%s", filename);
if ((fp = fopen(filename, "r")) == NULL) {
printf("ファイルが見つかりません");
return -1;
}
while (fgets(s1, sizeof s1, fp)) {
char *p1 = s1, *p2 = s2;
while (*p1) {
printf(" %02x", *p1 & 0xff);
int len = mb_len(p1);
printf("len = %d, len1=%d, len2=%d\n", len, len1, len2);
if (!strncmp(p1, "-", len1)) *p2++ = '-';
else if (!strncmp(p1, """, len2)) *p2++ = '"';
else memcpy(p2, p1, len), p2 += len;
p1 += len;
}
*p2 = 0;
fputs(s2, stdout);
}
fclose(fp);
return 0;
}
[quote=Timi116 post_id=151962 time=1539411691]
そちらのコード試してみたのですが、エラーは出なかったのですが、文字が出力されませんでした。
[/quote]
どんな入力を与えたのですか?
不具合を報告するときは、具体的な情報を示してください。
入力のすべての文字が出力されなかったのか、
半角の - や " が出力されなかったのか、などを含めて。
元のプログラムのダメだった理由は、char が 1バイトだからです。
通常の半角文字は1バイトですが、全角文字は 2~3バイトになります。
そして、fgetc は、1バイトを読み込む関数です。
次のテストプログラムでどのように表示されますか?
[code]
#include <stdio.h>
int main(void)
{
const char s[] = """;
unsigned char c;
for (const char *p = s; c = *p; p++) printf(" %02x", c);
putchar('\n');
printf("%08x\n", '"');
printf("%04x\n", L'"');
}
[/code]
私は次のような結果を予想しています。
[code]
ef bc 82
00efbc82
ff02
[/code]
さて、wchar_t を使ってだめなら、次のコードはどうでしょうか?
[code]
#include <stdio.h> // printf, scanf, fgets, fputs
#include <string.h> // strncmp, memcpy
int mb_len(const char *p)
{
unsigned char b = *p;
if (b < 0x80) return 1;
if (b < 0xe0) return 2;
if (b < 0xf0) return 3;
if (b < 0xf8) return 4;
if (b < 0xfc) return 5;
return 6;
}
int main()
{
char filename[FILENAME_MAX];
FILE *fp;
char s1[1024], s2[1024];
int len1 = mb_len("-");
int len2 = mb_len(""");
printf("ファイル名を入力してください:");
scanf("%s", filename);
if ((fp = fopen(filename, "r")) == NULL) {
printf("ファイルが見つかりません");
return -1;
}
while (fgets(s1, sizeof s1, fp)) {
char *p1 = s1, *p2 = s2;
while (*p1) {
printf(" %02x", *p1 & 0xff);
int len = mb_len(p1);
printf("len = %d, len1=%d, len2=%d\n", len, len1, len2);
if (!strncmp(p1, "-", len1)) *p2++ = '-';
else if (!strncmp(p1, """, len2)) *p2++ = '"';
else memcpy(p2, p1, len), p2 += len;
p1 += len;
}
*p2 = 0;
fputs(s2, stdout);
}
fclose(fp);
return 0;
}
[/code]