我的代码从文件中读取一个字符串,并将其及其长度显示在屏幕上。但是长度不正确(大于1)。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
FILE * file;
file= fopen("data.txt","r");
char* singleLine;
singleLine = (char *) malloc(150* sizeof(char *));
if(file){
while(!feof(file)){
fgets(singleLine,150, file);
puts(singleLine);
printf("length: %ld\n",strlen(singleLine));
}
}
fclose(file);
return 0;
}
答案 0 :(得分:0)
fgets(char *s, int size, FILE *stream)
从流中读取最多size-1
个字符,并将它们存储到s指向的缓冲区中。 在EOF或换行符之后停止读取。 如果读取换行符,它将存储在缓冲区中。缓冲区的最后一个字符之后将存储一个'\ 0'。
如果一行的长度小于149个字节,并且不是文件的末尾,则换行符将被读取到buf。因此,strlen的返回值将包括换行符。
另外:如果您只需要150个字符的缓冲区,而不是malloc(150* sizeof(char *))
,则malloc(sizeof(char) * 150)
可能更合理。
无需强制转换malloc的结果。有关详细信息,请问这个问题Do I cast the result of malloc?
答案 1 :(得分:0)
您可以通过以下方式摆脱换行符,该换行符会导致额外的长度:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string>
int main()
{
char* singleLine;
FILE * file = fopen("data.txt","r");
singleLine = (char *) malloc(150* sizeof(char));
if(file)
{
char *p = NULL;
while(fgets(singleLine, 150, file) != NULL) //giving the length here directly as 150 is important, because using sizeof() or strlen() only reads the 1st 3 characters(which is the size of char * on my platform) of the string.
{
p = strstr(singleLine,"\n");
if(p)
{
*p = '\0';
}
printf("%s\n", singleLine);
printf("length: %ld\n",strlen(singleLine));
}
if (feof(file))
{
fclose(file);
}
else
{
printf("some other error occured");
}
}
else
{
printf("inside else\n");
}
return 0;
}