Основная проблема, с которой вы сталкиваетесь, заключается в том, что вы не можете использовать отдельные указатели для strtol (ptr, &endptr, 2)
, что позволит вам работать со всеми значениями, содержащимися в chter
.Во-вторых, вы рискуете неопределенным поведением, потенциально читая 1000
символов, где chter
будет содержать только 500
.В-третьих, вам необходимо правильно проверить результаты преобразования strtol
, проверив (1), были ли преобразованы цифры;и (2) произошло ли переполнение / отток путем проверки errno
.
Собрав их вместе, вы можете сделать:
#include <errno.h>
...
if (fr != NULL) //see if file opens or not
{
char chter[500]; //char to get string from text
char *ptr = chter; /* assign chter to the pointer */
char *endptr; /* separate end-pointer for strtol */
fgets(chter, sizeof chter, fr); /* properly limit read size */
printf("%s", chter); //prints current text to cmd from textfile
puts("\n");
errno = 0; /* set errno zero */
while (*ptr && *ptr != '\n') /* loop over all values */
{
long li1 = strtol (ptr, &endptr, 2); /* convert to long */
if (ptr == endptr) { /* validate digits converted */
fputs ("error: no digits converted.\n", stderr);
/* handle error */
break;
}
else if (errno) { /* validate no over/underflow */
perror ("strtol-conversion_failed");
/* handle error */
break;
}
printf (" %ld", li1); /* output value */
ptr = endptr; /* advance pointer */
}
// puts("\n");
putchar ('\n'); /* use putchar for single-char output */
fclose(fr);
}
( примечание: не скомпилировано, поэтому, если у вас возникли проблемы, напишите об этом)