我尝试在 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
未初始化。你看,在 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()
,这是非常低效的。很多时候,如果在初始化之前传递任何一个参数,肯定是不行的。
事实上,它非常不安全,因为没有边界检查,调用者必须确保目标数组足够大以容纳两个字符串。
关于在 C 中连接两个字符串并在 Xcode 中收到信号 SIGABRT 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39258759/