当我不知道它将在C中分配多少个值时,如何使用scanf?

时间:2014-02-18 03:17:49

标签: c arrays scanf

以下是说明:      “读取标准输入中的字符,直到读取EOF(文件结束标记)。不要提示用户输入文本 - 只需在程序启动后立即读取数据。”

所以用户将输入字符,但我不知道有多少。我稍后需要使用它们来构建一个表格,显示输入的每个值的ASCII码。

我应该怎么做?

这是我的想法

int main(void){
     int inputlist[], i = -1;
     do {++i;scanf("%f",&inputlist[i]);}
         while(inputlist[i] != EOF)

4 个答案:

答案 0 :(得分:0)

你说的是字符。所以这可能会被使用

char arr[10000];
ch=getchar();
while(ch!=EOF)
{
   arr[i++]=ch;
   ch=getchar();
}
//arr[i]=0; TO make it a string,if necessary.

并转换为ASCII

for(j=0;j<i;j++)
     printf("%d\n",arr[j]);

如果您特别使用整数数组,请使用

int arr[1000];
while(scanf("%d",&arr[i++])!=EOF);

PPS:仅当您的输入每行一个字符时才有效。

scanfEOF

上返回EOF

答案 1 :(得分:0)

您有一个合理的尝试开始解决方案,但有一些错误。如果不指定大小,则无法定义数组,因此int inputlist[]甚至不应编译。对于float,你的scanf()说明符是%f,这是错误的两次(一次是因为你用整数类型声明inputlist,两次是因为你说你的输入是字符,所以你应该告诉scanf()使用%c%s),如果您在EOF之前无条件地阅读输入,则应使用无条件输入函数,例如fgets() }或fread()。 (或read(),如果您愿意的话。)

你需要两件事:存储当前输入块的地方,以及存储你已经读过的输入的地方。由于我上面提到的输入函数希望你指定输入缓冲区,你可以用一个简单的声明来分配它。

char input[1024];

但是,对于存储所有输入的位置,您需要动态分配的内容。最简单的解决方案是简单地malloc()一大块存储,跟踪它的大小,并在必要时realloc()

char *all_input;
int poolsize=16384;
all_input = malloc(pool_size);

然后,只需循环输入函数,直到返回值指示您已经点击EOF,并且在循环的每次迭代中,将输入数据附加到存储区域的末尾,将计数器的大小增加到输入数据,并检查您是否太接近输入存储区域的大小。 (如果您是,请使用realloc()来增加存储空间。)

答案 2 :(得分:0)

您可以通过getchar读取输入,直到达到EOF。而你不知道输入的大小,你应该在堆中使用动态大小的缓冲区。

char *buf = NULL;
long size  = 1024;
long count = 0;
char r;

buf = (char *)malloc(size);
if (buf == NULL) {
    fprintf(stderr, "malloc failed\n");
    exit(1);
}   

while( (r = getchar()) != EOF) {
    buf[count++] = r;
    // leave one space for '\0' to terminate the string 
    if (count == size - 1) {
        buf = realloc(buf,size*2);
        if (buf == NULL) {
            fprintf(stderr, "realloc failed\n");
            exit(1);
        }   
        size = size * 2;
    }   
}   
buf[count] = '\0';
printf("%s \n", buf);

return 0;

答案 3 :(得分:0)

以下是完整的解决方案,可满足您的需求。

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

// Number of elements
#define CHARNUM 3

int main(int argc, char **argv) {
    // Allocate memory for storing input data
    // We calculate requested amount of bytes by the formula:
    // NumElement * SizeOfOneElement
    size_t size = CHARNUM * sizeof(int);

    // Call function to allocate memory
    int *buffer = (int *) calloc(1, size);

    // Check that calloc() returned valid pointer
    // It can: 1. Return pointer in success or NULL in faulire
    //         2. Return pointer or NULL if size is 0 
    //            (implementation dependened). 
    //            We can't use this pointer later.

    if (!buffer || !size)
    {
        exit(EXIT_FAILURE);
    }

    int curr_char;
    int count = 0;
    while ((curr_char = getchar()) != EOF)
    {
        if (count >= size/sizeof(int))
        {
            // If we put more characters than now our buffer
            // can hold, we allocate more memory
            fprintf(stderr, "Reallocate memory buffer\n");
            size_t tmp_size = size + (CHARNUM * sizeof(int));
            int *tmp_buffer = (int *) realloc(buffer, tmp_size);
            if (!tmp_buffer)
            {
                fprintf(stderr, "Can't allocate enough memory\n");
                exit(EXIT_FAILURE);
            }
            size = tmp_size;
            buffer = tmp_buffer;
        }
        buffer[count] = curr_char;
        ++count;
    }


    // Here you get buffer with the characters from 
    // the standard input
    fprintf(stderr, "\nNow buffer contains characters:\n");
    for (int k = 0; k < count; ++k)
    {
        fprintf(stderr, "%c", buffer[k]);
    }
    fprintf(stderr, "\n");

    // Todo something with the data

    // Free all resources before exist
    free(buffer);
    exit(EXIT_SUCCESS); }

如果您使用gcc,请使用-std=c99选项进行编译。

此外,您可以使用getline()函数,该函数将逐行读取标准输入。它将为存储行分配足够的内存。只需调用它直到End-Of-File。

errno = 0; 
int read = 0; 
char *buffer = NULL;
size_t len = 0;
while ((read = getline(&buffer, &len, stdin)) != -1) 
{ // Process line } 

if (errno) { // Get error }

// Process later

请注意,如果您使用getline(),则无论如何都应该使用动态分配的内存。但不是存储字符,而是存储指向字符串的指针。