获取C中char缓冲区(来自文件读取)的值数

时间:2016-12-18 15:52:51

标签: c

我想从一行文件中读取字符(用于学校练习)。运动状态表示该字符串最多为1000个字符。

使用以下代码,我能够在char []中读取文件内容:

FILE *fp;
const int buffsize = 1000;
char *filepath = argv[1];
char buff[buffsize];

fp = fopen(filepath, "r");
fscanf(fp, "%s", buff);
//buff has the file contents

考虑到这些包括:

#include <stdio.h>
#include <stdlib.h>

这似乎工作正常,但是当我想迭代数组时,它超出了实际的数组长度(因为我将buffsize固定为1000我假设)。我怎么能以更好的方式处理这个问题,所以我可以迭代正确数量的索引?

2 个答案:

答案 0 :(得分:0)

C - &#34;字符串&#34; 1000个字符的缓冲区需要1000 + 1 = 1001 char s的缓冲区,因为C - &#34;字符串&#34;的结尾由另外的0表示。

因此,要使代码实际读取1000个字符,请更改

const int buffsize = 1000;

const int buffsize = 1000 + 1;

并确保只扫描1000 char而不是溢出buff,请更改

fscanf(fp, "%s", buff);

fscanf(fp, "%1000s", buff);

答案 1 :(得分:0)

要获得字符串的长度(这是一个更好的术语,因为它与它所在的缓冲区的大小没什么关系),请使用strlen()

const size_t len = strlen(buff);

这将计算第一个0字符前的字符数,这是字符串在C中终止(&#34;结束标记&#34;)的方式。

现在,您可以根据需要使用索引进行迭代:

for(size_t i = 0; i < len; ++i)
  printf("The character at index %zu is '%c'\n", i, buff[i]);

请注意,许多C程序员将使用指针直接迭代缓冲区:

for(const char *s = buff; *s != '\0'; ++s)
  printf("Found character '%c'\n", *s);