我试图在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的文件并写入其中。由于我将有几百个这样的文件,我需要循环遍历它们,每次更改名称。
答案 0 :(得分:0)
问题是name
未初始化。你看,在c字符串中使用约定,它们是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()
,效率非常低,如果在初始化之前传递其中任何一个参数,它肯定无效。
事实上,它非常不安全,因为没有绑定检查,调用者必须确保目标数组足够大以容纳两个字符串。