以下是说明: “读取标准输入中的字符,直到读取EOF(文件结束标记)。不要提示用户输入文本 - 只需在程序启动后立即读取数据。”
所以用户将输入字符,但我不知道有多少。我稍后需要使用它们来构建一个表格,显示输入的每个值的ASCII码。
我应该怎么做?
这是我的想法
int main(void){
int inputlist[], i = -1;
do {++i;scanf("%f",&inputlist[i]);}
while(inputlist[i] != EOF)
答案 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:仅当您的输入每行一个字符时才有效。
scanf
在EOF
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()
,则无论如何都应该使用动态分配的内存。但不是存储字符,而是存储指向字符串的指针。