C语言中的固定大小缓冲区数组

C语言中的固定大小缓冲区数组,c,arrays,C,Arrays,我试图写一个程序,其中缓冲区的大小应该是固定的。固定的意思是上限是固定的。程序应将第一个元素向左移位1,并将新元素移到缓冲区数组的末尾 例如: 输出应该类似于:1234 2345 3456,其中最后一位是输入 这就是我尝试过的 #include<stdio.h> #include<string.h> int main(){ char buffer[5]="1234"; //5 for '\0' //char buffer[]=""; char patter

我试图写一个程序,其中缓冲区的大小应该是固定的。固定的意思是上限是固定的。程序应将第一个元素向左移位1,并将新元素移到缓冲区数组的末尾

例如: 输出应该类似于:1234 2345 3456,其中最后一位是输入

这就是我尝试过的

#include<stdio.h>
#include<string.h>
int main(){
char buffer[5]="1234";        //5 for '\0'
//char buffer[]="";

char pattern[]="1234";

char ch;


int idxToDel = 0; 
while(1){
  scanf("%c",&ch);
memmove(&buffer[idxToDel], &buffer[idxToDel + 1], strlen(buffer) - idxToDel);
buffer[3]=ch;
printf("%s",buffer);
  }
 return 0;
}
#包括
#包括
int main(){
字符缓冲区[5]=“1234”//5用于“\0”
//字符缓冲区[]=“”;
字符模式[]=“1234”;
char ch;
int idxToDel=0;
而(1){
scanf(“%c”和“ch”);
memmove(&buffer[idxToDel],&buffer[idxToDel+1],strlen(buffer)-idxToDel);
缓冲区[3]=ch;
printf(“%s”,缓冲区);
}
返回0;
}

程序中的第一个问题是以下语句:

scanf("%c",&ch);
memmove(&buffer[idxToDel], &buffer[idxToDel + 1], strlen(buffer) - idxToDel);
当您输入一个字符并按“回车”键时,按“回车”键后,
'\n'
字符仍保留在输入流中,下一次调用
scanf
,在无限
while
循环中,将消耗该字符,ch的下一个值将为
\n
字符

要解决此问题,请在格式字符串中的转换说明符前放置一个空格:

scanf(" %c",&ch);
第二个问题是这种说法:

scanf("%c",&ch);
memmove(&buffer[idxToDel], &buffer[idxToDel + 1], strlen(buffer) - idxToDel);
这在逻辑上是不正确的

由于
idxToDel
的值为0,因此此
memmove
将尝试将
strlen(buffer)-0
(=4)字节从源
&缓冲区[0+1]
移动到目标
&缓冲区[0]
(其衰减为
缓冲区
)。但在你的情况下,你只需要移动3个字符

memmove()
函数不检查源代码中是否有任何终止的空字符-它总是精确复制字节数

因此,您可以:

#include<stdio.h>
#include<string.h>

int main(){
        char buffer[5]="1234";        //5 for '\0'
        char ch;
        int indxtomove = 1;

        printf ("%s\n", buffer);

        while(1){
                scanf(" %c",&ch);
                memmove(buffer, &buffer[indxtomove], strlen(buffer) - indxtomove);
                buffer[3]=ch;
                printf("%s\n",buffer);
        }
        return 0;
}
#包括
#包括
int main(){
字符缓冲区[5]=“1234”//5用于“\0”
char ch;
int indxtomove=1;
printf(“%s\n”,缓冲区);
而(1){
scanf(“%c”和“ch”);
memmove(buffer)和buffer[indxtomove],strlen(buffer)-indxtomove;
缓冲区[3]=ch;
printf(“%s\n”,缓冲区);
}
返回0;
}

我想您是在询问循环队列。欢迎来到堆栈溢出!你提到了你尝试过的东西,但没有提到哪些有效,哪些无效。如果你能描述一下,并说明你的问题是什么,我们会更好地帮助你。我想要一个有无限个输入的程序,它将最后四个输入存储在一个数组中,这样我就可以将它与一个模式进行比较了。strcmp()编译带有所有警告和调试信息:
gcc-Wall-Wextra-g
with。改进您的程序以避免收到警告。使用调试器
gdb
I通常会实现一个循环缓冲区,带有指向开始和结束的指针,而不是实际移动内容。