n
文字にそれらを完了する配列の各文字列に'.'
文字を配置する関数を作成しようとしています。 そして、私はtmp
stingをstrcpyでもポインタでも配列の文字列にコピーできないことを除いて、うまくいきます。 コードは次のとおりです。文字列の配列内のstrcpy
void foo (char **t, int count, int n) {
int max = 0, i, j;
char *tmp;
for (i = 0; i < count; i++) {
if (max < strlen (t[i])) max = strlen (t[i]);
}
if (max > n) return;
for (i = 0; i < count; i++) {
int diff = n - strlen (t[i]);
tmp = (char *) malloc (diff * (sizeof (char) * n + 2));
for (j = 0; j < diff; j++) {
tmp [j] = '.';
}
tmp [j] = '\0';
strcat (tmp,t[i]);
t[i] = (char *) realloc (t[i], strlen (tmp) + 10);
strcpy (t[i], tmp);
//*(t + i) = *tmp; <- I tried this method too
free (tmp);
}
}
だからそれがうまく実行されている(2つの文字列を連結し)、strcpy (t[i], tmp);
コマンドまで。 私は何が間違っていますか?
(私が知っている、私は不必要に大きなスペースを確保し、私はそれを確認するために行う。)
私はそれが使用するmain()
機能:
int main()
{
char *t[3] = {"string", "foo", "help"};
int i;
foo(t, 3, 10);
for (i = 0; i < 3; ++i)
printf("%s\n", t[i]);
return EXIT_SUCCESS;
}
それはコンパイルエラーを与えていない、また警告。
実行時にクラッシュし、-1073741819(0xC0000005)を返します。何も印刷しません。
私はCodeBlocksを使用しています。
'strcpy'は、バッファオーバーフローによって悪用される可能性があるため、安全ではありません。 – arboreal84
t配列に結果を格納するのに十分なスペースがない可能性があります。 –
@ arboreal84 'strcpy'は、第2引数が' \ 0 'で終わっていて、最初の引数に十分なスペースがあることを証明できれば、完全に安全です。 't [i] =(char *)realloc(t [i]、strlen(tmp)+ 10);'これがそうであることを示唆します。 –