私は現在、3つの引数、2つのファイル(1つの入力と1つの出力)、int(出力行の最大長、xと呼ぶ)をとるcプログラムを書いています。私は、入力ファイルのすべての行を読み込み、最初のx文字を出力ファイルに書き込む(効果的にファイルをトリミングする)。ここでC:UTF-8以外の文字が生成されないようにするにはgetcを使用するには?
は私のコードです:
int main(int argc, char *argv[]) {
const char endOfLine = '\n';
if (argc < 4) {
printf("Program takes 4 params\n");
exit(1);
} else {
// Convert character argument [3] (line length) to an int
int maxLen = atoi(argv[3]);
char str[maxLen];
char *inputName;
char *outputName;
inputName = argv[1];
outputName = argv[2];
// Open files to be read and written to
FILE *inFile = fopen(inputName, "r");
FILE *outFile = fopen(outputName, "w");
int count = 0;
char ch = getc(inFile);
while (ch != EOF) {
if (ch == '\n') {
str[count] = (char)ch;
printf("Adding %s to output\n", str);
fputs(str, outFile);
count = 0;
} else if (count < maxLen) {
str[count] = ch;
printf("Adding %c to str\n", ch);
count++;
} else if (count == maxLen) {
str[count] = '\n';
}
ch = getc(inFile);
}
}
return 0;
}
唯一の問題は、最後の文字が単一引用符であれば、それはのような、非UTF-8文字を出力していることである:
For Whom t
John Donne
No man is
Entire of
Each is a
A part of
If a clod
Europe is
As well as
As well as
Or of thin
Each man��
For I am i
Therefore,
For whom t
配列をオーバーフローさせた 'else if(count == maxLen)'セクションで未定義の動作があります。 – paddy
シングルバイト文字を含むデータストリームの非UTF8文字とは何ですか? – bvj
@bvj 0-127の範囲にない8ビットの 'char'は、正しくコード化されたUTF8コードポイントではありません。 – chux