gpt4 book ai didi

C : buffer and pointers

转载 作者:行者123 更新时间:2023-12-02 07:42:21 24 4
gpt4 key购买 nike

我正在编写一个小程序,它必须:

  1. 询问用户将输入多少个数字(动态存储在 2 个选项卡中)
  2. 逐步输入数字,如果是正数,则数字进入 bufferP,如果是负数,则进入 bufferN
  3. 如果缓冲区中没有更多空间,则将其大小加倍
  4. 最后 printf 两个缓冲区

这是我的代码:

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

int main(){
int length = 0;
printf("Number of data: \n");
scanf("%d", &length);
int *bufferP = (int*)malloc(2*sizeof(int));
int *bufferN = (int*)malloc(2*sizeof(int));
int number = 0;
for (int i = 0 ; i <= length ; i++){
scanf("%d", &number);
if(number < 0){
if(*bufferN == NULL){
printf("No more place");
exit(0);
}
*bufferN= number;
*bufferN++;
}

if(number >= 0){
if(*bufferP == NULL){
printf("No more place");

}
*bufferP = number;
*bufferP++;
}

}

int res =0;
printf("tab negative : ");
for (int i = 0; bufferN[i] != NULL; i++)
{
res = bufferN[i];
printf("%d\n", res );
}
printf("tab positive : ");
for (int i = 0; bufferP[i] != NULL; i++)
{
res = bufferP[i];
printf("%d\n", res );
}
}

我遇到了这些错误:

 In function ‘main’:
rev_S3_ptr.c:14:16: error: comparison between pointer and integer [-Werror]
if(*bufferN == NULL){
^~
rev_S3_ptr.c:19:4: error: value computed is not used [-Werror=unused-value]
*bufferN++;
^~~~~~~~~~
rev_S3_ptr.c:23:16: error: comparison between pointer and integer [-Werror]
if(*bufferP == NULL){
^~
rev_S3_ptr.c:28:4: error: value computed is not used [-Werror=unused-value]
*bufferP++;
^~~~~~~~~~
rev_S3_ptr.c:35:29: error: comparison between pointer and integer [-Werror]
for (int i = 0; bufferN[i] != NULL; i++)
^~
rev_S3_ptr.c:41:29: error: comparison between pointer and integer [-Werror]
for (int i = 0; bufferP[i] != NULL; i++)

所以我的问题是:

  1. 缓冲区的工作原理就像一个选项卡,对吧?那么为什么我不能直接说如果指针为空,它就已满并执行 *buffer++ ?
  2. 在“没有更多的地方”,我必须将缓冲区的大小加倍,但我不知道该怎么做。

最佳答案

这个版本怎么样:

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

int main(){
int length = 0;
printf("Number of data: \n");
scanf("%d", &length);
int bufferP_size = 2, bufferP_loc = 0;
int *bufferP = (int*)malloc(bufferP_size*sizeof(int));
int bufferN_size = 2, bufferN_loc = 0;
int *bufferN = (int*)malloc(bufferN_size*sizeof(int));
int number = 0;
for (int i = 0 ; i <= length ; i++) {
scanf("%d", &number);
if(number < 0) {
if(bufferN_loc == (bufferN_size - 1)) {
int *temp_buffer;
printf("No more room in negative buffer, extending\n");
bufferN_size *= 2;
temp_buffer = (int*)realloc(bufferN,bufferN_size*sizeof(int));
if (temp_buffer == NULL) {
printf("Memory allocation failed, aborting\n");
free(bufferP);
free(bufferN);
exit(EXIT_FAILURE);
}
bufferN = temp_buffer;
}
bufferN[bufferN_loc++] = number;
}

if(number >= 0) {
if(bufferP_loc == (bufferP_size - 1)) {
int *temp_buffer;
printf("No more room in positive buffer, extending\n");
bufferP_size *= 2;
temp_buffer = (int*)realloc(bufferP,bufferP_size*sizeof(int));
if (temp_buffer == NULL) {
printf("Memory allocation failed, aborting\n");
free(bufferP);
free(bufferN);
exit(EXIT_FAILURE);
}
bufferP = temp_buffer;
}
bufferP[bufferP_loc++] = number;
}
}

int res =0;
printf("tab negative : ");
for (int i = 0; i < bufferN_loc; i++)
{
res = bufferN[i];
printf("%d\n", res );
}
printf("tab positive : ");
for (int i = 0; i < bufferP_loc; i++)
{
res = bufferP[i];
printf("%d\n", res );
}
free(bufferP);
free(bufferN);
exit(EXIT_SUCCESS);
}

显着的变化是:

  • 读入缓冲区时不要丢弃缓冲区指针的开头
  • realloc 是扩展缓冲区的 friend
  • 您不能使用指向缓冲区的指针来确定何时到达缓冲区的末尾,您必须自己跟踪缓冲区有多大
  • 存储当前位置以及缓冲区的大小,以便您可以跟踪从何处读取和写入

关于C : buffer and pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53865895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com