c读入文本后,用strlen函数测不出正确长度

想实现horspool算法,需要读入一个文本文件后查询它的字符数。读入正确(用printf能显示出来),但是用strlen函数测文本长度显示只有2,(真实长度应该有百十万个字符)导致算法不能实现。。
不知道为啥啊,正确读入了,也能显示出来,但是长度只有2,求大神解答!感激不尽!
char text[]="";
int test=0;
    
    FILE *fp=fopen("/Users/liuchong/Desktop/t.txt","r");
   if(!fp)
    {
        printf("can't open file\n");
        return -1;
    }
    while(!feof(fp))
    {
        fscanf(fp,"%c",&text);
        test++;
     
        printf("%s",text);
        
    
    }
    printf("\n");
    fclose(fp);
    
    printf("%d\n",test);
    int len=strlen(text);
    printf("%d\n",len);

输出的两个数字是
169377
2

169377应该是字符数。。。

阅读 4.7k
4 个回答

你的数组名text是一个指向数组第一个元素的指针,fscanf(fp,"%c",&text)这一句实际上是取得是text这个指针的地址,而不是数组中的第test个元素,改为&text[test]或者text+test

实际上并没有正确把文件中的内容读取到缓冲区中.
首先看你的text声明

char text[]="";
// 实际上这是你只是声明了一个仅包含一个'\0'元素的数组, 注意! C中的数组是不可以自己增长的.
// 这就是你的主要问题所在
char text[] = { '\0' }; // 这个是你声明的另一种写法.

至于你为啥运行没报错呢.看你的while循环

fscanf(fp,"%c",&text);
// 从 fp 文件指针中读取一个字符到 text 中
// 这个语句其实可以拆开为
//
// char buffer;
// fscanf(fp, "%c", &buffer);
//
// 所以你只是单纯把读取的这个字符替换掉了原本的 \0 空字符
test++;
// 这是个计数器吧?不知道是不是你写错了,还是我猜测那样.
printf("%s",text);
// 注意这里
// 你使用 %s 这个格式说明符输出 text 这个字符串.
// 众所周知, 一个字符串是以 \0 作为结束的标志的. 但是你声明的缓冲区只有一个位置,还被读取的字符占住了
// 而 text 是存放在 栈 上面的(至于为啥, 貌似超纲了). 所以 printf 会从 text 的位置开始向后查找
// 直到遇到第一个 \0 字符为止, 或者访问错误出现.
// 而栈的实现依赖于系统实现. 比如 windows 就是直接向后退 0xCC 个字节,并初始化为 0xCCCCCCCC.
// 所以实际上, 如果你的操作系统栈的实现是初始化为 0x00000000 的话, 那就不会出错了.
// 因为你的 text 后一个字节就是 \0 字符. 如果在 Windows 上应该会输出一堆的 烫烫烫 (不知道你懂这个梗不 :) )

反汇编

至于之后的 strlen 的输出也可以同理推导.

数组的声明有问题,循环里面把文本读入数组的方式也有问题

是不是含有中文等多字节字符?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进