如何在按enter键之前将数字输入到矢量中



我想要一个通用的代码,不需要输入数字的数量。而不是做类似的事情

#include <stdio.h>
void main(){
int n,a[100];
scanf("%d", &n);
for(int i=0;i<n;i++)
scanf("%d ", a[i]); }

在这里,我首先输入n,然后在数组中输入n个数字。

举一个更具体的例子,我想对两个集合的并集和重聚进行编码。我不考虑每个集合的元素数量,而是随意输入它们,而不限于";n〃;我在上面提到过。

有没有什么方法可以跳过输入n?我该如何声明我的数组不丢失内存。

您需要使用一个指向内存块的指针,每次获得新数字时,内存块的大小都会不断增加:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
int *a = NULL;
int n = 0;
char str[10000];
while(fgets(str, sizeof str, stdin) != NULL &&
strlen(str) > 1)
{
n += 1;
a = realloc(a, n * sizeof(int));
a[n-1] = atoi(str);
}
for(int i = 0 ; i < n ; ++i)
printf("a[%d] = %dn", i, a[i]);
}

在线GDB此处

您需要动态增加内存缓冲区。这里有一个方法,它将第一个数组读取为空格分隔的整数,并在输入中查找分号来判断第二个数组何时启动:

/* Read two sets of integers */
#include <stdio.h>
#include <stddef.h>
#include <ctype.h>
#include <stdlib.h>
void * xrealloc(void *buf, size_t nmemb, size_t size, void *iterator);
struct buffer {
int *start;
int *end;
size_t cap;
};
void push(int c, struct buffer *);
int
main(void)
{
int c;
struct buffer a = {0};
struct buffer b = {0};
while( scanf("%d", &c) == 1 ){
push(c, &a);
}
if( (c = getchar()) != ';' ){
fprintf(stderr, "Unexpected inputn");
return EXIT_FAILURE;
}
while( scanf("%d", &c) == 1 ){
push(c, &b);
}
printf("set a: ");
for( int *p = a.start; p < a.end; p++ ){
printf("%s%d", p > a.start ? ", " : "", *p);
}
printf("nset b: ");
for( int *p = b.start; p < b.end; p++ ){
printf("%s%d", p > b.start ? ", " : "", *p);
}
putchar('n');
return 0;
}
void
push(int c, struct buffer *b)
{
if( b->start == NULL || b->end >= b->start + b->cap ) {
b->start = xrealloc(b->start, b->cap += BUFSIZ, 1, &b->end);
}
*b->end++ = c;
}
void *
xrealloc(void *buf, size_t num, size_t siz, void *endvp)
{
void **endp = endvp;
ptrdiff_t offset = buf && endp && *endp ? *endp - buf : 0;
buf = realloc(buf, num * siz);
if( buf == NULL ){
perror("realloc");
exit(EXIT_FAILURE);
}
if( endp != NULL ){
*endp = buf + offset;
}
return buf;
}

一个简单的运行看起来像:

$ echo '1 3 5; 3 5 9 3 5' | ./a.out 
set a: 1, 3, 5
set b: 3, 5, 9, 3, 5

通常的方法是使用fgets读取一行,然后使用sscanf解析该行。类似于:

char buffer[2048];
int a[100], n;
if (fgets(buffer, sizeof(buffer), stdin)) {
n = 0;
char *p = buffer;
int len;
while(n < 100 && sscanf("%d%n", &a[n], &len) > 0) {
++n;
p += len; } }

您可能还想对数组a使用malloc/realloc,这样它就可以根据输入从小处开始,然后根据需要增大,但这是一个不同的问题(这里有很多答案(。

相关内容

  • 没有找到相关文章

最新更新