在C

时间:2017-06-29 16:41:36

标签: c arrays char scanf

我想编写一个程序,询问用户一些输入值并根据输入值给出结果。以下代码有效,但当我输入“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;
}

3 个答案:

答案 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;
}

也在这里http://ideone.com/cDxkDV

答案 1 :(得分:1)

不,没有办法。您必须确保有足够的内存来随时保存用户的数据。也许在某些时候用户会尝试写100个字符。在这种情况下,您需要内存中可用的101个字节来进行零跟踪。

如果您使用sscanfgets,仍需要内存来保存字符串,在这两种情况下,您都不知道输入可以预期的字节数。

  

以下代码有效,但当我输入&#34; John&#34; 100个内存中只使用4个空格。其他96人被浪费了。

不,其他95人都被浪费了,你缺少零落零。

如果你想做低效的代码,那么你可以为每个收到的字符realloc内存,但是你必须使用getchar函数从输入中读取char。

进一步阅读

How can I read an input string of unknown length?

答案 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时,输入读取过程终止。

此方法非常节省内存,但需要更多时间来执行。因此,我们总是需要管理性能与内存之间的权衡。希望这会有所帮助。