我正在使用while循环逐个输入字符(要输入的字符总数未知)。如何将我的角色存储在数组中:

时间:2015-08-12 13:33:24

标签: c getchar putchar

用户必须输入未知长度的字符串(<1000)。所以我在这里使用while循环,#definegetchar 我该怎么做才能同时存储字符?

#include <stdio.h>
#define EOL '\n'

int main()
{
    int count=0;
    char c;

    while((c=getchar())!= EOL)// These c's have to be stored.
    {
        count++;
    }

    return 0;
}
编辑:对不起我之前没有说过这件事。如果count!=1000,我不必浪费1000个字节。这就是为什么我最初没有声明任何1000个元素的数组。

2 个答案:

答案 0 :(得分:1)

如果你不确切知道字符串中有多少个字符,但是有一个硬上限,你可以简单地为该上限分配足够的空间:

char tmpArray[1000];

将字符存储在那里:

while((c=getchar())!=EOL)
{
    tmpArray[count] = c;
    count++;
}

然后在循环结束后你知道有多少个字符(通过计数变量),你可以分配一个具有正确数量的新数组并将临时字符串复制到其中:

char actualArray[count];
for(int i = 0;i < count + 1;i++) {
    actualArray[i] = tmpArray[i];
}

然而,这并不是很好,因为无法从内存中释放/删除大型数组。使用malloc和char *来执行此操作可能是个更好的主意:

char* tmpArray = malloc((sizeof(char)) * 1001);
while((c=getchar())!=EOL) {
    tmpArray[count] = c;
    count++;
}

char* actualArray = malloc((sizeof(char)) * count + 1);
strncpy(actualArray, tmpArray, count + 1);
free(tmpArray);

/***later in the program, once you are done with array***/
free(actualArray);

strncpy的参数是(destination,source,num),其中num是要传输的字符数。我们添加一个来计数,以便传输字符串末尾的空终止符。

答案 1 :(得分:1)

实现动态增长的数组

  1. 使用calloc()malloc()分配一个小内存块 - 让我们说10个字符

  2. 如果需要,使用realloc()增加内存块的大小

  3. 示例:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define EOL '\n'
    
    int main()
    {
        int count = 0;
        int size = 10;
        char *chars = NULL;
        char c;
    
        /* allocate memory for 10 chars */
        chars = calloc(size, sizeof(c));
        if(chars == NULL) {
            printf("allocating memory failed!\n");
            return EXIT_FAILURE;
        }
    
        /* read chars ... */
        while((c = getchar()) != EOL) {
            /* re-allocate memory for another 10 chars if needed */
            if (count >= size) {
                size += size;
                chars = realloc(chars, size * sizeof(c));
                if(chars == NULL) {
                    printf("re-allocating memory failed!\n");
                    return EXIT_FAILURE;
                }
            }
            chars[count++] = c;
        }
    
        printf("chars: %s\n", chars);
    
        return EXIT_SUCCESS;
    }