如果我要打印整个字符串,则一切看起来都很好,空格和缩进看起来都很完美(我正在用此代码加载源文件)。
但是,如果我尝试在缓冲区中打印单个字符,我会收到本来应该没有的字母。
例如,如果我打印buffer[2]
时得到的字母应该是空格,但是如果我打印整个字符串,则字母不存在。
这是我的代码不起作用:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char *buffer = (char*) malloc(100*sizeof(char));
FILE *myFile;
myFile = fopen("thisSourceFile.c", "r");
if (!myFile) {
printf("could not open file");
}
else {
while(fgets(buffer,100,myFile)) {
printf("%c \n",buffer[2]);
}
}
fclose(myFile);
free(buffer);
buffer = NULL;
return 0;
}
输出:
n
n
n
t
h
I
y
f
p
l
w
p
}
r
u
e
正如您所看到的,它是在空白处打印字母。如果我打印整个字符串,这些字母将不存在。
答案 0 :(得分:0)
如果您有兴趣解析源文件并处理每个字符,这可能是一个解决方案。
但是有两个常数。 chars
和num_lines_to_read
。
M.M在下面的评论中提到isprint()
并不是完全可移植的,并且有些怪癖要注意。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void) {
const int chars = 100; /* Num chars per line to read */
const int num_lines_to_read = 3; /* Num lines to read */
char *buffer = (char*) malloc(chars*sizeof(char));
int i = 0, j = 0;
FILE *myFile;
myFile = fopen("thisSourceFile.c", "r");
if (myFile == NULL) {
printf("could not open file");
fclose(myFile);
return 1;
}
for(i=0; i<num_lines_to_read; i++)
{
if(fgets(buffer,chars,myFile) != NULL)
{
while(isprint((unsigned char) buffer[j]))
{
printf("%c", (buffer[j]));
j++;
}
j=0;
}
}
fclose(myFile);
free(buffer);
return 0;
}
示例输出(本身!)
#include <stdio.h>#include <stdlib.h>#include <ctype.h>