0
#include <stdio.h>
#include <string.h>

int main() {
  char tab[2]={"12"};
  FILE *outfile;
  char *outname = "/home/dir/";
  printf("%s", strcat(outname,tab));
  outfile = fopen(strcat(outname,btab), "w");
  if (!outfile) {
    printf("There was a problem opening %s for writing\n", outname);
  }
}

次のエラーがあります: セグメンテーション違反。

どうすれば修正できますか?

4

4 に答える 4

1

outnameは文字列リテラルであり、文字列リテラルは変更できません。文字列リテラルの変更は未定義の動作です。

于 2012-07-15T10:54:36.420 に答える
1

少なくとも 2 つのエラー:

char tab[2] = {"12"};

使用したほうがよいtab[3]か、さらに良いでしょうtab[]-終端の NUL 文字には 1 つの余分な文字が必要です。

また、

char *outname = "etc...";

strcatは、実行可能ファイルのデータ セグメントに定数文字列を作成します。これは、最初のパラメーターを使用して 2 つの文字列を連結するため、上書きできません。そのstrcat()ため、そうしようとすると、セグメンテーション違反が発生します。使用する

char outname[50]; // something big enough
strcpy(outname, "/home/dir");

代わりは。

于 2012-07-15T10:57:56.003 に答える
0

あなたのコードでは、

char *outname = "/home/dir/";

outname は文字列リテラルであるため、strcat と一緒に使用すると、連結された文字列を保持するのに十分な長さがありません。これにより、セグメンテーション違反が発生します。

以下のように宣言した場合も同様です。

char outname[] = "/home/dir/";

これに対する解決策は、連結された文字列を保持するのに十分な大きさの outname のサイズを宣言することです。

char outname[80] = "/home/dir/";
于 2015-07-13T15:47:53.763 に答える
0

outnameConst ポインターであるため、一度何かを入力すると、それを変更することはできません。

ただし、コピーする場合は、コピーする文字列のサイズがわかっているため、tab[] 配列と同じサイズの char 配列を作成します。ほとんどの場合、OUTNAME のような char ポインターは、ユーザーからの入力を 1 回受け取り、その入力の長さが分からない場合に使用されます。

于 2012-07-15T10:58:06.103 に答える