報錯:scanf_s函數報錯:沒有爲格式字符串傳遞足夠的參數
int main() {
char s1[20] = "i m name";
char *p1, *p2;
char s3[10] = {0};
p1 = s1;
p2 = s3;
printf("請輸入你的名字: \n");
scanf_s("%s",&s3);
printf("%s\n", s3);
for (; *p1 != '\0'; p1++) {
if (*p1 == *p2) {
p2 = s3;
}
printf("I am %s\n", s3);
}
while (true){}
return 0;
}
這個問題很變態
解決辦法:在使用%c和%s讀入字符或字符串時,應在地址參數後附加一個緩衝區邊界值。
int main() {
char s1[20] = "i m name";
char *p1, *p2;
char s3[10] = {0};
p1 = s1;
p2 = s3;
printf("請輸入你的名字: \n");
//scanf_s("%s",&s3);
scanf_s("%s",&s3,sizeof(s3)); //使用sizeof
printf("%s\n", s3);
for (; *p1 != '\0'; p1++) {
if (*p1 == *p2) {
p2 = s3;
}
printf("I am %s\n", s3);
}
while (true){}
return 0;
}
總結;就會提示你沒有爲格式字符串傳遞足夠的參數。
首先我們來看一下scanf和scanf_s的區別
scanf()不會檢查輸入邊界,可能造成數據溢出。
scanf_s()會進行邊界檢查。
scanf()函數是標準C中提供的標準輸入函數,用以用戶輸入數據
scanf_s()函數是Microsoft公司VS開發工具提供的一個功能相同的安全標準輸入函數,從vc++2005開始,VS系統提供了scanf_s()。在調用該函數時,必須提供一個數字以表明最多讀取多少位字符。
上面的程序有點複雜;下面來一個簡單點的例子:
int main(void) {
char str1[30] = { 0 };
char str2[30] = { 0 };
char str3[30] = { 0 };
//gets() 用法
printf("Input a string: ");
gets_s(str1);
//scanf() 用法
printf("Input a string: ");
scanf_s("%s", str2);
scanf_s("%s", str3);
printf("\nstr1: %s\n", str1);
printf("str2: %s\n", str2);
printf("str3: %s\n", str3);
while (true){}
return 0;
}
上面的代碼當你輸入字符串的時候會報錯:沒有爲格式字符串傳遞足夠的參數