在 C 中连接两个字符串并在 Xcode 中收到信号 SIGABRT 错误

标签 c xcode c-strings

我尝试在 C 中连接两个字符串并收到“线程 1:信号 SIGABRT”错误。

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>

int main() {
    char name[50];
    ifile = fopen("stats.list", "r");

for(;;) {
    fscanf(ifile, "%s%f%f", name, &sky, &stddev);
    if (feof(ifile))
    break;

    char ext[5] = ".par";
    dataparsFile = strcat(name, ext);

    dataparsFile = fopen(dataparsFile, "w");

    fprintf(dataparsFile, "%s\n",
            "stuff gets read in to file named after new string";

    fprintf(ofile, "phot ");
    fprintf(ofile, "%s%s%s%s%s%s \n",
            ", datapars=", dataparsFile);
}

fclose(ifile);
fclose(ofile);

代码的目标是获取读入的图像名称并添加 .par 扩展名。然后,我想打开一个名为 image+.par 的文件并写入其中。由于我将有几百个这样的文件,因此我需要循环遍历它们,并且每次都更改名称。

最佳答案

问题是name未初始化。你看,在 字符串使用约定,它们是任何 ASCII 序列(可能是其他一些可打印字符,但原则上只是 ASCII),后面必须跟着 '\0'标记字符串结尾的字节。

您的name数组没有这个 '\0'所以strcat()尝试找到它,但失败了,并且可能读取超出了数组末尾,尽管无论如何读取未初始化的数据是未定义的行为。

方式strcat(dst, src)作品差不多是这样的

char *
strcat(char *const dst, char *src)
{
    // Make a pointer to keep dst's address
    // unchanged and return it
    char *ptr = dst;
    // Compute search for the end of the destination
    // string to start copying there
    while (*ptr != '\0')
        ptr++;
    // Copy all the characters from `src' until the '\0'
    // occurs
    while (*src != '\0')
        *(ptr++) = *(src++);
    *ptr = '\0';
    return dst;
}

如您所见,如果您调用strcat(),这是非常低效的。很多时候,如果在初始化之前传递任何一个参数,肯定是不行的。

事实上,它非常不安全,因为没有边界检查,调用者必须确保目标数组足够大以容纳两个字符串。

关于在 C 中连接两个字符串并在 Xcode 中收到信号 SIGABRT 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39258759/

相关文章:

c - malloc 返回内存或虚拟地址空间

ios - 是否可以从 IOS 项目中导出 IOS 框架?

C++模板C字符串参数

c - 用于修改 ELF 二进制文件动态部分的工具

c - FRDM K82f uart 中断仅触发约 8 次

C 程序需要帮助修复我的代码(数组的概念)

iphone - 如何获取输入法改变的事件或通知?(IOS5.1)

iOS:如何在确认对话框后动画隐藏在表格单元格 "delete"菜单中?

c - 在程序中出现不兼容的整数到指针的转换错误。不确定这是如何/为什么会发生,但正在寻找解释

c - 我可以将char * [20]转换为char [] [20]吗?