不能使用损坏的字符串

时间:2017-11-26 17:13:06

标签: c string fopen

我创建了一个从文件中读取一行的函数。结果是一个可打印的字符串但是当我在fopen中输入字符串时,fopen无法找到该文件。我认为readline读取的文件路径已损坏。我希望你能帮助我。代码在这里:

char *readUntilNewLine(FILE *file_stream, bool until_eof)
{     
bool stop_reading = false;
int char_counter = 1;

char *line_string;
line_string = (char*)malloc(STRING_BLOCK);

if(line_string == NULL)
{
  return NULL;
}

while(!feof(file_stream))
{    
char current_char = fgetc(file_stream);
//printf("%c\n", current_char);

if(current_char == '\n')
{
  //line_string[char_counter - 1] = '\0';
  return line_string;
}

if(char_counter % STRING_BLOCK == 0)
{
  printf("----\n");
  line_string = realloc(line_string, STRING_BLOCK * char_counter);

  if(line_string == NULL)
  {
    return NULL;
  }
}

line_string[char_counter - 1] = current_char;

printf("%d ", strlen(line_string));
printf("%c ", current_char);
printf("%d\n", char_counter - 1);

char_counter += 1;
}

if(until_eof == true)
{
  line_string[char_counter - 1] = (char)0;
}
else
{
  return NULL;
}
}

1 个答案:

答案 0 :(得分:1)

让我们手动执行readUntilNewLine(),假设该文件包含a b c \n . . {{1 }}:

  1. .
  2. stop_reading = false(你是一个乐观主义者;此时大多数程序员都会放char_counter = 1,因为毕竟你当前没有读过任何字符)
  3. char_counter = 0(对line_string = malloc(STRING_BLOCK)的演员不会给你任何东西;此时char *包含line_string[],其中?????????...?是垃圾{{} 1}}发现那里)
  4. 检查?
  5. 的结果
  6. 检查malloc();因为你没有读过任何东西,所以没有设定。 (C不是Pascal; {<1}}仅在之后设置为,您尝试读取文件末尾。)
  7. malloc()(这是feof()
  8. 不是feof()
  9. 没有填写块
  10. current_char = fgetc(file_stream)
  11. a(现在是2)
  12. 检查\n
  13. line_string[char_counter - 1] = current_char(这是char_counter += 1
  14. 不是feof()
  15. 没有填写块
  16. current_char = fgetc(file_stream)
  17. b(现在是3)
  18. 检查\n
  19. line_string[char_counter - 1] = current_char(这是char_counter += 1
  20. 不是feof()
  21. 没有填写块
  22. current_char = fgetc(file_stream)
  23. c(现在是4)
  24. 检查\n
  25. line_string[char_counter - 1] = current_char(这是换行符)
  26. char_counter += 1成功
  27. feof()哇!你返回一个未终止的字符串!此时current_char = fgetc(file_stream)包含current_char == '\n',其中return line_string是在那里找到的任何垃圾line_string[]