c - 如何从 fgets 中获取正在读取的行的长度并对其进行循环

标签 c for-loop sizeof fgets

我试图遍历 fgets 中一行的每个字符,但我遇到了错误,我将在下面解释。

int main(int argc, char* argv[]) {
   char arr[200]
   int currS = sizeof(arr) / sizeof(char);
   // call readIt function

}

void readIt(char* argv[], char arr[], int currS) {
  FILE* file;
  file = NULL;
  file = fopen(argv[1], "r");
  while(fgets(arr, currS, file) != NULL) 
    for (int i = 0; i < sizeof(arr); i++) 
       print each char of current line
}

当我对每一行执行 for 循环时,每一行输出将是文件中第一行的长度。 for 循环迭代的次数永远不会改变。我该如何更新它?我查看了其他 SO 问题,但它们不是很有帮助..

最佳答案

readIt()功能,你需要strlen(arr) , 不是 sizeof arr .后者会给你 char * 的大小, 它总是相同的,不管它可能指向的字符串的长度如何。

您还应该检查 fopen() 的返回值不是 NULL , 自 fopen()可能因多种原因而失败。

void readIt(char* argv[], char arr[], int currS) {
    FILE * file = fopen(argv[1], "r");
    if ( file ) {
        while( fgets(arr, currS, file) ) {
            const int len = strlen(arr); 
            for ( int i = 0; i < len; ++i ) {
                // print each char of current line
            }
        }
    }
}

注意使用变量 len这里意味着你只计算一次字符串的长度,在你开始循环它之前,而不是每次通过循环计算它,如果你做了 for ( int i = 0; i < strlen(arr); ++i ) 就会发生。 .如果您所做的只是打印每个字符,那么字符串的长度不会在两次调用 fgets() 之间发生变化。 , 因此多次计算效率低下。

另外,除非出于某种原因你想要 main() 中的数组包含在 readIt() 之后从文件中读取的最后一行返回,您可以更轻松地定义 arrreadIt() 内本身,以避免将其传递给该函数的需要,例如:

void readIt(char* argv[]) {
    FILE * file = fopen(argv[1], "r");
    if ( file ) {
        char arr[200];
        while( fgets(arr, sizeof arr, file) ) {
            const int len = strlen(arr); 
            for ( int i = 0; i < len; ++i ) {
                // print each char of current line
            }
        }
    }
}

因为 arr现在是 readIt() 中的实际数组, 而不是指向 char 的指针(不能将数组传递给函数,只能传递一个的地址),sizeof arr会给你数组的实际大小,而不是 char * 的大小, 所以你可以把它传递给 fgets() .

关于c - 如何从 fgets 中获取正在读取的行的长度并对其进行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28621173/

相关文章:

java - 使用for循环在数组中查找最大值和最小值?

c++ - 使用 for 循环中的计数器作为条件

C:在 sizeof() 内转换数组时出现意外结果

c - 用宏类型查找替换 "getter"函数

c - h_errno 总是打印 "unknown host"

r - 如何在要重复 5000 次的 for 循环中找到相关系数?并保存统计

c++ - 在编译时打印 sizeof(T)

c++ - 有没有办法获取函数的大小并为其复制和执行分配内存?

c++ - 将库添加到 C/c++ eclipse indigo 项目

c - 从函数返回时小数部分丢失