我想用C编写一个程序,该程序将接受stdin
中任意长度的一行并显示它或将任何函数应用于该字符串。为此,我需要一个具有动态长度的字符串(char []
)。
这是我的方法:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv){
char *line;
line = malloc(10);
line[0] = '\0';
char *str = malloc(10);
fprintf(stdout, "Please enter your line:\n");
while(fgets(str, 10, stdin)){
//check for line break
if(str[strlen(str)-1] == '\n'){
str[strlen(str) - 1] = '\0';
strcat(line, str);
break;
}
strcat(line, str);
line = realloc(line, strlen(line) + 10);
str = realloc(str, strlen(str) + 10);
}
fprintf(stderr, "you entered %s\n", line);
//just for testing
/*
fprintf(stderr, "\n str= %s \n", str );
fprintf(stderr, "\n line= %s \n", line);
*/
free(line);
free(str);
exit(EXIT_SUCCESS);
}
但是,这看起来很糟糕。我需要两个字符数组。在char *str
中,我将从stdin编写输入并将其连接到char *line
。 str
最多只能容纳10个字节的字符,因此,我需要将所有内容连接到line
。
在这种情况下,是否存在一种更干净的方法来保存stdin
的输出并对其应用某些功能?我做错了吗?是否可以在没有malloc
和realloc
的情况下完成?
答案 0 :(得分:1)
这是一个例子。您需要添加malloc和realloc结果检查(为了简单起见,我没有这样做)
#include <stdio.h>
#include <stdlib.h>
#define CHUNK 32
char *readline(void)
{
size_t csize = CHUNK;
size_t cpos = 0;
char *str = malloc(CHUNK);
int ch;
while((ch = fgetc(stdin)) != '\n' && ch != '\r')
{
str[cpos++] = ch;
if(cpos == csize)
{
csize += CHUNK;
str = realloc(str, csize);
}
}
str[cpos] = 0;
return str;
}
int main()
{
printf("\n%s\n", readline());
return 0;
}
工作示例:https://onlinegdb.com/Sk9r4gOYV
还应该在不再需要时释放分配的内存。