-2

我正在尝试从文件中获取每一行并进行一些字符串操作。但是我的一段代码抛出了段错误。我将同一行作为不同的程序测试了相同的东西,它工作正常。但是当我从文件中读取并执行字符串操作时,它会引发分段错误。

变量声明:

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);
4

3 回答 3

1

您不初始化str1and str2,这意味着当您使用strcat它时,它会尝试查找前一个字符串的结尾,但这可以在 中的任何位置str1,即使在str1str1包含零的情况下也是如此。

将声明更改为此,它应该会更好地工作:

char *pch3, str1[100] = "", str2[100] = "";
于 2012-09-12T07:55:29.127 回答
0

要考虑的一个特殊细节: 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(),并添加保护或至少检查缓冲区长度以避免缓冲区溢出的断言。

于 2012-09-12T08:36:40.220 回答
0

虽然这不能解决您当前的问题,但请考虑使用 stat(3) 和 mmap(3)。然后您可以处理内存区域。或者,您可以使用 fgets(3)/feof(3)/ferror(3) 进行循环并处理每一行输入。

请通过 memset 将所有缓冲区初始化为零。

你也可以做

char str1[100] = { 0 };

strcat(3) 也是邪恶的,你可以尝试使用 snprintf(3) 代替,或者 strncat(3) 如果你知道你在做什么。阅读相关手册页以获取更多信息。

于 2012-09-12T07:55:12.273 回答