C Функция / объект не возвращает согласованный вывод при выполнении спама - PullRequest
0 голосов
/ 10 мая 2019

Я работаю над мини-проектом, который хранит свою базу данных в локальном файле и управляет им. Я все еще новичок в программировании, так что эта случайность вывода не в моих знаниях для отладки. Код на данный момент большой, поэтому я просто вставлю то, что имеет отношение.

extern void returnRecord(FILE *fp, fpos_t pos, char *retArr)
{ 
  char tok = delim;  //for strtok (delimiter = control char 21)
  char tmpArr[612]; //for strtok
  char *segment;     //pointer to save strtok return
  fsetpos(fp, &pos);  //beginning of the record
  fgets(tmpArr, 611, fp); 
  strtok(tmpArr,&tok);
  strcpy(retArr, tmpArr);
  strcat(retArr, "\n");
  segment = strtok(NULL, &tok); //tmpArr now has the author name

  int tmpCount = 0;
  char c = segment[0];
  int counter = strlen(retArr);
  while((c != 6) && (c != 0))
    {
      retArr[counter++] = c;
      c = segment[++tmpCount];
    }
  retArr[counter++] = '\n';



  segment = strtok(NULL, &tok); //tmpArr now has the rack number

  tmpCount = 0;
  c = segment[tmpCount++];
  while((c != 6) && (c != 0))
    {
      retArr[counter++] = c;
      c = segment[tmpCount++];
    }

  retArr[counter++] = '\n';


  segment = strtok(NULL, &tok); //tmpArr now has the book title

  tmpCount = 0;
  c = segment[tmpCount++];
  while((c != 6) && (c != 0) && (c != '\n'))
    {
      retArr[counter++] = c;
      c = segment[tmpCount++];
    }

  retArr[counter] = '\0';
  return;
}

Ниже приведен не C, а описание образца записи в моей базе данных:

<...> everything inside is my explanation
<6s> means a bunch of buffer characters that are all 0x06

3<delim>Isaac Newton<6s><delim>3<6s><delim>Philosophiæ Naturalis Principia Mathematica<6s><new line only if it's not the final record>

(delim is: #define delim 21 //at the top)

Вероятно, есть некоторые избыточности, но оптимизация не является моей непосредственной задачей, потому что выходные данные (char * retArr) не всегда согласованы. Вот некоторые из моих выводов при спаме исполняемого файла.

printf("%s\n strlen: %d\n", ret2, strlen(ret2)); //print code
(the first execution here shows the full correct output)
sflash@debian:~/Documents/AOHI/experimental/books$ ./exe
6
Stress test | boooiafnakekjfn/;
4124
e0q-pjrnoibq3uitu0o;@lt@qjtoilqnkubneugbq3tq3
 strlen: 84
sflash@debian:~/Documents/AOHI/experimental/books$ ./exe
6
Stress test | boooiafnakekjfn/;
41245
e0q-pjrn
 strlen: 48
sflash@debian:~/Documents/AOHI/experimental/books$ ./exe
6
Stress test | boooiafnakekjfn/;
41
45
 strlen: 39

Код, кажется, перепрыгивает через несколько итераций, когда я быстро запускаю программу. Это очень важно исправить, потому что я собираюсь вызывать эту функцию / объект внутри циклов.

1 Ответ

0 голосов
/ 10 мая 2019

Проблема была указана Некоторым программистом, чувак, я использовал strtok () неправильно и не соответствовал размерам массива. Разделитель должен заканчиваться символом NULL.

...