C 防止输入字符数组的缓冲区损坏
我想问一下如何防止数组缓冲区中的损坏,这是我的代码C 防止输入字符数组的缓冲区损坏,c,arrays,corruption,C,Arrays,Corruption,我想问一下如何防止数组缓冲区中的损坏,这是我的代码 #include <stdio.h> #define buffSize 20 void clrscr() { for(int i = 0; i < 25; ++i) putchar('\n'); } int main() { char arr1[buffSize]; char arr2[buffSize]; do { clrscr();
#include <stdio.h>
#define buffSize 20
void clrscr() {
for(int i = 0; i < 25; ++i)
putchar('\n');
}
int main() {
char arr1[buffSize];
char arr2[buffSize];
do {
clrscr();
printf("String 1 :\n");
scanf("%[^\n]", &arr1); fflush(stdin);//prompt first string
} while(strlen(arr1) > buffSize);
do {
clrscr();
printf("String 1: %s\n\n", arr1);//The problem is here
printf("String 2 : ");
scanf("%[^\n]", &arr2); fflush(stdin);
} while(strlen(arr2) > buffSize);
return 0;
}
#包括
#定义大小20
void clrsc(){
对于(int i=0;i<25;++i)
putchar('\n');
}
int main(){
字符arr1[buffSize];
字符arr2[buffSize];
做{
clrsc();
printf(“字符串1:\n”);
scanf(“%[^\n]”,&arr1);fflush(stdin);//提示第一个字符串
}而(strlen(arr1)>buffSize);
做{
clrsc();
printf(“字符串1:%s\n\n”,arr1);//问题就在这里
printf(“字符串2:”);
scanf(“%[^\n]”,&arr2);fflush(stdin);
}而(strlen(arr2)>buffSize);
返回0;
}
假设我们已经输入了与buffSize相对应的char的第一个arr,然后我们输入了char的第二个arr,它的输入超过了buffSize的限制。arr1将被分配一些在arr2大小以上输入的字符。如何防止这种情况?fflush(stdin)
是未定义的行为,通常仅为输出流定义
请尝试以下方法:
while ((c = getchar()) != '\n' && c != EOF);
如果试图限制scanf()
尝试读取的字符数,可以使用:
scanf("%19[^\n]", arr2);
请注意,
scanf()
中指定的数字必须比缓冲区大小小一个,以便为'\0'
节省空间,并且应该是arr1
和arr2
,无&
。数组名称已经是指向数组开头的指针。通常只使用->仅定义,类似于fflush()
函数只定义了输出流的行为,因为stdin
是一个输入流,那么fflush(stdin)
的行为是未定义的。虽然在实践中,它的实现是定义的,但根据标准,它的行为没有定义。。。这就是歧义的来源,但不是语言上的狡辩——你们都是对的@DavidC.Rankin好的,现在我要学习一个新的、肯定有用的单词。狡辩@DavidC.Rankin这是一个非常有用的词,我希望我以前知道,在我的语言Sutileza.Code中,它不检查scanf的返回值(“%19[^\n]”,arr2)代码>很弱。加一张支票。也scanf(“%19[^\n]”,arr2)
不能很好地处理以开头的行\n'
。最好使用fgets()
。有理由鼓励新的C用户使用fgets
而不是scanf
进行用户输入。这里fgets(arr1,arr1的大小,stdin)代码>(对于arr2
)也是如此。但是,与scanf
一样,您需要确保stdin
中没有未读的字符(例如,您输入50个字符,但数组大小为19
+nul终止字符。您当前的问题是“&”
在&arr1
和&arr2
(它们已经是指针,您不需要为scanf
获取指针地址)