我面临的情况是,除了处理更多的输入之外,我的函数完全按照我想要的方式执行。
我最初想逐个处理每个字符,但遇到了问题。因此,fscanf
不仅可以完成我想要它做的事情,而且对于仅读取一行也至关重要。我注意到,我无法通过这种方式为更大的数组重新分配空间。我已经尝试使用格式说明符,即 %*s
来预先包含特定数量的缓冲区空间,但这仍然不起作用。
我还注意到,我无法知道我正在读取的字符串的大小。
这是我的尝试和想法:
#define LINE_MAX 1000
char* getline(FILE* inputStream)
{
int capacity = LINE_MAX;
char* line = malloc(capacity * sizeof(char));
int ch;
/* if (sizeof(capacity) == sizeof(line)) { // Not a valid comparison? Too late?
capacity *= 2;
line = realloc(line, capacity * sizeof(line));
} */
if (fscanf(stream, "%[^\n]s", line) == 1) {
ch = fgetc(inputStream);
if (ch != '\n' && ch != EOF) {
fscanf(inputStream, "%*[^\n]");
fscanf(inputStream, "%*c");
}
free(line);
return line;
}
free(line);
return NULL;
}
总的来说,我对内存分配很陌生,但我觉得我很清楚在这里要做什么。事实证明我错了。
最佳答案
这是读取一行并将其存储在字符数组中的示例。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
signed char *str;
int c;
int i;
int size = 10;
str = malloc(size*sizeof(char));
for(i=0;(c=getchar()) !='\n' && c != EOF;++i){
if( i == size){
size = 2*size;
str = realloc(str, size*sizeof(char));
if(str == NULL){
printf("Error Unable to Grow String! :(");
exit(-1);
}
}
str[i] = c;
}
if(i == size){
str = realloc(str, (size+1)*sizeof(char));
if(str == NULL){
printf("Error Unable to Grow String! :(");
exit(-1);
}
}
str[i] = '\0';
printf("My String : %s", str);
return 0;
}
如果当前数组无法容纳从输入读取的字符,则数组大小将调整为原始大小的两倍。
关于c - 动态地从文件或标准输入中读取一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940151/