如何输出比分配的内存长的字符串

时间:2013-12-26 09:45:24

标签: c arrays string malloc

我昨天写了这段代码。我的目标是: 我要求用户输入一个字符串。我将它存储在一个数组中。如果他输入的字符串长于数组长度,那么在屏幕上的数组输出数组字符后,我会输出getchar()的其余字符,除非遇到换行符。代码在这里:

#include<stdio.h>
#include<malloc.h>

#define BACKUP 20

int main()
{
    char *input=NULL;
    char rest[BACKUP],c;

    input= malloc(sizeof(char)*20);
    printf("%lu",sizeof(input));

    int i=0,j=1;

    printf("\nEnter a very long string.\n\n>>");
    fgets(input, sizeof(input), stdin);
    printf("%s",input);
    while((rest[i]=getchar())!='\n')
    {       
        i=1;    
        for(;i<BACKUP;i++)
            rest[i]=getchar();
        i=0;
        for(;i<BACKUP;i++)
            printf("%c",rest[i]);
        i=0;
    }
return 0;
}

问题是,第一个循环顺利但在此之后它表现得如此奇怪。能否请你纠正呢 如果有其他方法可以解决这个问题,那会更好 我可以通过getchar()从输入区域输出所有字符,这不是一个解决方案。我的意思是,我不再需要阵列了吗? 我应该realloc()进行数组,然后在数组中输入其余的字符吗?最后当输入区域没有任何东西时,我应该在屏幕上打印数组内容 任何人都可以告诉用户输入同时存储在哪里吗?我在哪里可以学习/研究C编译器在基础级别上发生的事情?

1 个答案:

答案 0 :(得分:1)

声明

fgets(input, sizeof(input), stdin);  

是错误的,因为sizeof(input)会给你指针input的大小而不是分配的内存大小。将其更改为

fgets(input, 20, stdin);  

并输出其余字符,试试这个

char rest;
printf("\nEnter a very long string.\n\n>>");
fgets(input, 20, stdin);
printf("%s\n",input);
while((rest=getchar())!='\n')
{
    putchar(rest);
}  
  

我可以通过getchar()从输入区域输出所有字符,这不是一个解决方案。我的意思是,我不再需要数组了吗?

getchar是一个输入函数,您无法将其用于输出。您可以使用putchar执行此操作。如果您只想输出它们,则无需为其余字符使用数组。我将char rest[]更改为char rest

  

有人可以告诉用户输入同时存储在哪里吗?

输入存储在系统缓冲区(shell)中。当您按 Enter 返回键时,它将转到C标准缓冲区。