“01110011 01100001 01100100”这将是一行,其中8位由文件中的空格分隔。
目前我有:
if (fr != NULL) //see if file opens or not
{
char chter[500]; //char to get string from text
char *ptr; //pointer to char
//char store[100][32];
fgets(chter, 1000, fr); //gets text from file
printf("%s", chter); //prints current text to cmd from textfile
puts("\n");
for (int i = 0; i < 1; i++)
{
li1 = strtol(chter, &ptr, 2); //convert 1st binary set to alphabet
printf("%c", li1); //Not sure how to get the rest of the sets from here on
}
puts("\n");
fclose(fr);
}
我正在考虑使用2d数组来存储多个字符串,但是我被卡住了。因为我不知道如何从另一个字符串中单独提取二进制位。
在每次调用strtol
之后,ptr
将指向字符串中不属于已解析整数的第一个字节。这将是您下一次迭代的起点。由于fgets
返回带换行符的字符串,因此循环直到ptr
指向字符串末尾的换行符或空字节。
char *ptr, *tmp;
tmp = chter;
do
{
li1 = strtol(tmp, &ptr, 2);
printf("%c", li1);
tmp = ptr;
} while ((*ptr != '\n') && (*ptr != '\0'));
你遇到的主要问题是没有为strtol (ptr, &endptr, 2)
使用单独的指针,这将允许你处理chter
中保存的所有值。其次,你可能会通过阅读1000
字符冒险未定义的行为,其中chter
只会持有500
。第三,你需要通过检查(1)数字是否被转换来正确验证strtol
转换的结果; (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);
}
(注意:没有编译,所以如果你有问题就丢一张便条)