存储用户输入而不声明任意大的数组。

时间:2014-05-17 16:49:29

标签: c

我正在进行字符输入并存储它而不声明任意大的数组。问题是代码不会打印存储的值(尽管它完美地打印了我输入的元素数量)。工作原理是:在第一个for循环执行中创建“b”并复制“c”(c现在包含任意内容),然后用户覆盖“b”中的任何内容,然后更新的“b”是复制到“c”。在第二个和后面的循环执行中,“c”基本上是旧的“b”,并且“b”通过复制“c”并在最后输入新元素而不断更新。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char e = 'a';   
    char *b,*c = &e;    
    printf("start entering the characters and enter Z to terminate:\n");
    char d;
    int i,m;    
    for(i=0;(d=getchar()) != 'Z';i++)
    {
        b=malloc(sizeof(char)*(i+1));
    strcpy(b,c);        
    scanf("%c",b+i);
    c=malloc(sizeof(char)*(i+1));
    strcpy(c,b);
    }
    printf("-----------------------------------------------------------------\n");
    int q=strlen(b);    
    printf("%d\n",q);
    //printf("%s\n",b);
    for(m=0;m<q;m++)
        printf("%c",b[m]);
    return 0;   
}

2 个答案:

答案 0 :(得分:0)

我不确定为什么问题代码同时使用'getchar()'和'scanf()';也许我错过了什么?

而且,如'BLUEPIXY'所述,realloc()更好。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>

    int main()
        {
        char   *b    = NULL;  /* This will be the reference to the self-growing array. */
        size_t  bLen = 0;     /* This is the length of the string in 'b' (not counting the string termination character.) */

        for(;;)
          {
          char *x; /* Used to safely grow the array 'b' larger. */
          int d;   /* Use an 'int'.  'getchar()' returns an 'int', (not a 'char'). */

          /* Get a character from stdin. */
          d=getchar();
          if('Z' == d)
             break;

           /* Safely grow the array 'b' large enough to hold the one more character. */
          x=realloc(b, (bLen+1) * sizeof(*b));
          if(NULL == x)
             {
             fprintf(stderr, "realloc() failed.\n");
             exit(1);
             }
          b=x;

          /* Store the character in the array and re-terminate the string. */
          b[bLen++] = d;
          b[bLen] = '\0';
          }

        printf("-----------------------------------------------------------------\n");
        printf("%s\n",b);

       if(b)
          free(b);

        return 0;
        }

答案 1 :(得分:0)

一些印象:

  1. 将所有变量赋予单字符名称会比阅读此代码的人更难以理解你想要做的事情。

  2. 当您完成使用malloc()分配的内存块后,需要使用free()发布内存。

  3. strcpy()用于以空字符结尾的字符串,所以我认为它不会像你期望的那样做。请考虑使用memcpy()。您对strlen()的使用也存在同样的问题。你不应该用任何东西替换它,因为i应该已经给你字符数。

  4. 您的scanf()语句是否尝试将字符复制到缓冲区中?只需使用简单的作业like b[i] = d

  5. 如果Z是用户的第一个按键,b将永远不会被初始化,并且当您尝试在循环后的代码中访问它时会发生错误的事情。

  6. 在循环的每次迭代期间重新分配内存效率非常低。相反,考虑在一开始就分配少量空间 - 比如20个字符。然后在你的循环体中,如果你的缓冲区有足够的空间容纳一个新角色,你需要做的就是复制那个角色。如果你的缓冲区空间不足,那么重新分配一个更大的内存块,但不仅仅是一个额外的字符;为另外20个(或其他)预留空间。

  7. 每次重新分配只需要拨打malloc()(或者更好,realloc(),如BLUEPIXY所建议的那样)。我不确定你为什么要用两个。

  8. 在结尾处终止输入,以便在想要显示时将其视为字符串。

  9. 如果您对此有任何疑问,我很乐意为您提供帮助。