簡體   English   中英

從文件讀取時我的 C 程序中的分段錯誤

[英]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);

您沒有初始化str1str2 ,這意味着當您使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM