我的情况是我的功能正是我想要的,除了处理更多的输入量。
我最初想过逐个处理每个角色但是遇到了这样做的问题。所以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;
}
我对内存分配一般不熟悉,但我觉得我好好知道该怎么做。事实证明我错了。
答案 0 :(得分:0)
以下是读取一行并将其存储在Character数组中的示例。
#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;
}
如果当前数组不能保存从输入中读取的字符,则将数组的大小调整为其原始大小的两倍。