C语言中的固定大小缓冲区数组
我试图写一个程序,其中缓冲区的大小应该是固定的。固定的意思是上限是固定的。程序应将第一个元素向左移位1,并将新元素移到缓冲区数组的末尾 例如: 输出应该类似于:1234 2345 3456,其中最后一位是输入 这就是我尝试过的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
#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通常会实现一个循环缓冲区,带有指向开始和结束的指针,而不是实际移动内容。