我正在尝试从文件中获取每一行,并进行一些字符串操作。但是我的代码段抛出了seg错误。我把同一个东西作为一个不同的程序测试了一行,它运行得很好。但当我从文件中读取并进行字符串操作时,它会给我带来分段错误。
变量声明:
char *pch3,str1[100],str2[100]
pch3 = strtok(line3,",");
while(pch3!=NULL)
{
if(strcmp(pch3,"?") == 0)
{
strcat(str1,"0");
strcat(str1,",");
}
else
{
strcat(str1,pch3);
strcat(str1,",");
}
pch3 = strtok(NULL,",");
}
strlen1=strlen(str1);
memcpy(str2,str1,strlen1-1);
fp2=fopen("breast-cancer-wisconsin-miscellaneous-cleansed.data","a");
fprintf(fp2,"%sn",str2);
fclose(fp2);
您不初始化str1
和str2
,这意味着当您使用strcat
时,它会尝试查找上一个字符串的末尾,但它可以在str1
中的任何位置,即使在str1
不包含零的情况下也可以在str1
之外。
将声明更改为这个,它应该会更好地工作:
char *pch3, str1[100] = "", str2[100] = "";
虽然这不能解决您当前的问题,但请考虑使用stat(3)和mmap(3)。然后可以处理内存区域。或者,您可以使用fgets(3)/feof(3)/filor(3)进行循环,并处理每一行输入。
请通过memset将所有缓冲区初始化为零。
你也可以做
char str1[100] = { 0 };
strcat(3)也是邪恶的,如果你知道自己在做什么,你可以试着使用snprintf(3),或者strncat(3)。阅读相关手册页以了解更多信息。
需要考虑的一个特殊细节是:strtok()修改作为第一个参数传入的字符串。以下代码有效:
#include <stdio.h>
#include <string.h>
void processLine (const char *line3) {
char *pch3 = NULL, str1[100] = "", str2[100] = "";
int strlen1 = 0;
FILE* fp2 = NULL;
pch3 = strtok (line3, ",");
while (pch3 != NULL) {
if (strcmp (pch3, "?") == 0) {
strcat (str1, "0");
strcat (str1, ",");
} else {
strcat (str1, pch3);
strcat (str1, ",");
}
pch3 = strtok (NULL, ",");
}
strlen1 = strlen (str1);
memcpy (str2, str1, strlen1 - 1);
fp2 = fopen ("breast-cancer-wisconsin-miscellaneous-cleansed.data", "a");
fprintf (fp2, "%sn", str2);
fclose (fp2);
}
main () {
char input[100] = "first,?,second,third,fourth,?";
processLine (input);
}
同样,请考虑使用更多的缓冲区溢出安全函数,如strncat()而不是strcat(),并添加保护或至少是断言来检查缓冲区长度以避免缓冲区溢出。