我试图遍历 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()
之后从文件中读取的最后一行返回,您可以更轻松地定义 arr
在 readIt()
内本身,以避免将其传递给该函数的需要,例如:
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/