无法在C中比较文件的行

vatpfxk5  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(92)

我得到了这段代码:

void scanLinesforArray(FILE* file, char search[], int* lineNr){
    char line[1024];
    int line_count = 0;
    while(fgets(line, sizeof(line),file) !=NULL){
        ++line_count;
        printf("%d",line_count);
        printf(line);
        char *temp = malloc(strlen(line));
//      strncpy(temp,line,sizeof(line));
//      printf("%s\n",temp);
        free(temp);
        continue;
    }
}

这将打印文件的所有行,但只要我取消对strncpy()的注解,程序就会停止,没有错误。
当我使用strstr()将该行与我的搜索变量进行比较时,同样的情况也会发生。
我尝试了continue语句和其他多余的东西,但没有任何帮助。

bybem2ql

bybem2ql1#

很多问题:

不将常规字符串打印为格式

如果字符串包含%,则代码会有未定义行为的风险。

// printf(line);  // BAD

printf("%s", line);
// or 
fputs(line, stdout);

错误的大小

strncpy(temp,line,sizeof(line));strncpy(temp,line, 1024);类似,但temp指向的分配字节数小于1024。代码尝试在分配的内存之外写入。未定义的行为(UB)。
代码很少使用strncpy()

错误的说明符

%s需要匹配 * 字符串 *。temp未指向 * 字符串 *,因为它缺少 * 空字符 *。而是为'\0'分配。

// printf("%s\n", temp);`.  

char *temp = malloc(strlen(line) + 1); // + 1
strcpy(temp,line);
printf("<%s>", temp);
free(temp);

无比较

“无法比较C中文件的行”很奇怪,因为没有比较代码。
回想一下,fgets()通常会在line[]中保留一个'\n'
也许吧

long scanLinesforArray(FILE* file, const char search[]){
  char line[1024*4];    // Suggest wider buffer - should be at least as wide as the search string.
  long line_count = 0;  // Suggest wider type
  while(fgets(line, sizeof line, file)) {
    line_count++;
    line[strcspn(line, "\n")] = 0; // Lop off potential \n
    if (strcmp(line, search) == 0) {
      return line_count;
    }
  }
  return 0; // No match
}

高级:示例性能更好的代码。

long scanLinesforArray(FILE *file, const char search[]) {
  size_t len = strlen(search);
  size_t sz = len + 1;
  if (sz < BUFSIZ) sz = BUFSIZ;
  if (sz > INT_MAX) {
    return -2; // Too big for fgets()
  }
  char *line = malloc(sz);
  if (line == NULL) {
    return -1;
  }

  long line_count = 0;
  while (fgets(line, (int) sz, file)) {
    line_count++;
    if (memcmp(line, search, len) == 0) {
      if (line[len] == '\n' || line[len] == 0) {
        free(line);
        return line_count;
      }
    }
  }

  free(line);
  return 0; // No match
}

相关问题