Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 防止输入字符数组的缓冲区损坏_C_Arrays_Corruption - Fatal编程技术网

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
获取指针地址)