は、次のプログラムを考えてみましょう:strncat():対象の文字列のランダムな文字
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
int ret = 0;
char dirname[] = "test/";
int path_maxlen = 256;
char path[path_maxlen];
int filename_maxlen = path_maxlen - strlen(dirname);
strncat(path, dirname, path_maxlen - 1);
strncat(path, "file.txt", filename_maxlen);
FILE *file = fopen(path, "r");
printf("path: %s\n", path);
if (file != NULL) {
printf("success\n");
fclose(file);
} else {
printf("fail\n");
ret = 1;
}
return ret;
}
これが最初で動作するように見えますが、それはそれは存在していたが、つまりは、ファイルを開くことができませんでした、失敗し始め、プログラムやファイルに変更はありませんでした。
その時点で、path
という行が追加されました。出力をファイルにリダイレクトした後、path
の前にランダムな文字(ASCII:1 SOH 'heading start')が付いていたことが判明しました。だからここではstrncat
が正しく使用されておらず、いくつかのランダムな迷惑メールが私のパス配列に書き込まれると仮定します。
上記の例の文字列を正しく連結するにはどうすればよいですか?
PS:私のOSはUbuntu 16.04です。コンパイラは、次のとおりです。
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
'char path [path_maxlen] = {0};' – DyZ
@DYZ Alasは、可変長配列に対しては機能しません。 – AlexD
@AlexDだから私は決して可変長配列を使用しません...だから、 'path [0] = 0;'です。 – DyZ