从文件中读取时,我的C程序出现分段错误



我正在尝试从文件中获取每一行,并进行一些字符串操作。但是我的代码段抛出了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);

您不初始化str1str2,这意味着当您使用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(),并添加保护或至少是断言来检查缓冲区长度以避免缓冲区溢出。

相关内容

  • 没有找到相关文章

最新更新