![](/img/trans.png)
[英]Segmentation fault (core dumped) error while reading a file line by line in C for my process scheduling simulator program
[英]Segmentation fault in my C program while reading from a file
我試圖從文件中獲取每一行並執行一些字符串操作。 但是我的一段代碼引發了段錯誤。 我在一行中測試了相同的東西作為不同的程序,它工作正常。 但是當我從文件中讀取並執行字符串操作操作時,它會引發我的分段錯誤。
變量聲明:
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,"%s\n",str2);
fclose(fp2);
您沒有初始化str1
和str2
,這意味着當您使用strcat
它會嘗試找到前一個字符串的結尾,但是如果str1
不包含零,則它可以位於str1
任何位置,甚至在str1
之外。
將聲明更改為此,它應該會更好地工作:
char *pch3, str1[100] = "", str2[100] = "";
雖然這不能解決您當前的問題,但請考慮使用 stat(3) 和 mmap(3)。 然后您可以處理內存區域。 或者,您可以使用 fgets(3)/feof(3)/ferror(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, "%s\n", str2);
fclose (fp2);
}
main () {
char input[100] = "first,?,second,third,fourth,?";
processLine (input);
}
同樣,請考慮使用更多緩沖區溢出安全函數,例如 strncat() 而不是 strcat() 並添加保護或至少斷言檢查緩沖區長度以避免緩沖區溢出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.