【问题标题】:Segmentation fault strcpy/strcat分段错误 strcpy/strcat
【发布时间】:2020-10-05 22:05:59
【问题描述】:

我正在编写一个程序来打开一个文件(比如“input_file”),操作其内容,然后将其输出到另一个文件(“manipulated-input_file”)

我通过以下方式使用 strcpy 和 strcat 完成了这项工作:

char t-filename[]="Manipulated-", filename[50], td-filename[50];
memset ( filename, '\0', FILE_NAME);

printf("Please enter the filename - \n");
scanf( "%30s", filename );
strcpy(td-filename,filename);
strcat(t-filename,td-filename);
printf("%s\n", t-filename);

现在 printf 函数将 t-filename 打印为“Manipulated-input_file”

在这部分之后,我有一个部分可以打开“input_file”和 做点什么。

fptr = fopen(filename, "r");
while ( fgets (line, sizeof line, fptr) != NULL)
{
 ...do something...
}
fclose(fptr);

后来我想在代码末尾打开一个名为“t-filename”的文件:

tptr = fopen(t-filename, "w");
fprintf(tptr,"something");
fclose(tpr); 

当我编译这段代码时,我得到“分段错误(核心转储)”。

我不知道出了什么问题。有人可以帮忙吗?

【问题讨论】:

  • 你能发布真正的代码而不是这个吗?鉴于t- 等在 C 语言中不是有效标识符,并且此代码永远无法编译。
  • 请尝试创建一个合适的minimal reproducible example,最好是我们可以复制粘贴(无需修改)并自己尝试。
  • 作为一个提示:想想t-filename 的大小。你认为这个数组会有多少个元素?
  • 我会发布代码...
  • 来自编辑。正如评论transfilename 没有备用元素strcat(transfilename,translatedfilename); 可以工作。它立即溢出。

标签: c strcpy strcat


【解决方案1】:

transfilename 没有足够的空间来容纳strcat(transfilename,translatedfilename); 添加的其他项目。 "Translated-" 已经填满了,因为 [] 为您提供了初始化字符串中的确切字符数量,以及一个空终止符。

您需要将其更改为 char transfilename [LARGE_ENOUGH] 或使用动态内存分配来更改运行时的大小。

【讨论】:

  • 你能告诉我在这种情况下如何设置动态内存吗?这是否意味着我必须在读取“文件名”后使用 char transfilename[SIZE]?
【解决方案2】:

strcat(t-filename,td-filename);

t-filename 不足以容纳结果,它是未定义的行为。

这里也一样

strcat(transfilename,translatedfilename);

transfilename 不足以容纳结果,它是未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2011-03-16
    • 2014-10-21
    • 2013-02-23
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多