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

时间:2016-08-31 20:49:53

标签: 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的文件并写入其中。由于我将有几百个这样的文件,我需要循环遍历它们,每次更改名称。

1 个答案:

答案 0 :(得分:0)

问题是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(),效率非常低,如果在初始化之前传递其中任何一个参数,它肯定无效。

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