我想编写一个程序,询问用户一些输入值并根据输入值给出结果。以下代码有效,但当我输入“John”时,在100内存中只使用了4个空格。其他96人浪费了。此外,无法保证输入将小于100个字符(非常不可能但可能)。有没有办法优化这个?
P.S:当我研究它时,一些网站说我应该使用sscanf()或fgets(),但我不明白如何在我的代码中使用它们。 P.P.S:我是C的新手,所以请告诉我最简单的方法。#include <stdio.h>
int main()
{
char name[100];
printf("Your name: \n");
scanf("%100s", name);
printf("Name: %s \n", name);
return 0;
}
答案 0 :(得分:2)
您需要为此操作重新分配内存(程序运行时将更改内存)
char *name = 0;
char *tmp = 0;
int inputAsingleChar,i=0,j=4;
printf("Your name: \n");
while((inputAsingleChar = getchar()) != '\n' && inputAsingleChar != EOF)
{
if(i==j){
j+=4;
tmp = realloc(name, j);
if(tmp== NULL){printf("Couldn't realloc but the 'name' array is still valid");}
else{name = tmp;}
}
name[i++] = inputAsingleChar ;
}
name[i] = '\0';
printf("Name: %s \n", name);
free(name);
free(tmp);
版本2(最终版)在慷慨的David Bowling的帮助下
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int inputAsingleChar,i=0,j=4;
char *name = malloc(j);
if (name == NULL){
printf("No memory");
exit(1);
}
printf("Your name: \n");
while((inputAsingleChar = getchar()) != '\n' && inputAsingleChar != EOF)
{
if(i==j){
j+=4;
char * tmp = realloc(name, j);
if(tmp== NULL){printf("Couldn't realloc but the 'name' array is still valid");}
else{name = tmp;}
}
name[i++] = inputAsingleChar ;
}
name[i] = '\0';
printf("Name: %s \n", name);
free(name);
return 0;
}
答案 1 :(得分:1)
不,没有办法。您必须确保有足够的内存来随时保存用户的数据。也许在某些时候用户会尝试写100个字符。在这种情况下,您需要内存中可用的101
个字节来进行零跟踪。
如果您使用sscanf
或gets
,仍需要内存来保存字符串,在这两种情况下,您都不知道输入可以预期的字节数。
以下代码有效,但当我输入&#34; John&#34; 100个内存中只使用4个空格。其他96人被浪费了。
不,其他95人都被浪费了,你缺少零落零。
如果你想做低效的代码,那么你可以为每个收到的字符realloc
内存,但是你必须使用getchar
函数从输入中读取char。
进一步阅读
答案 2 :(得分:1)
如果您担心内存使用情况,请使用动态分配内存,即使用malloc()
和realloc()
,您可以获得某些行为,例如:
int main() {
char a;
int i=0;
char *str=0;
while((a=getchar())!='\n')
{
str=realloc(str,i+2); //1 for character to store, + 1 for '\0' terminating character
str[i++]=a;
}
str[i]='\0';
printf("%s\n",str);
return 0;
}
当用户输入字符时,此代码会生成内存并立即存储结果。当用户按Enter
时,输入读取过程终止。
此方法非常节省内存,但需要更多时间来执行。因此,我们总是需要管理性能与内存之间的权衡。希望这会有所帮助。