解決scanf_s函數報錯:沒有爲格式字符串傳遞足夠的參數

報錯: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;
}

上面的代碼當你輸入字符串的時候會報錯:沒有爲格式字符串傳遞足夠的參數

解決辦法:在使用%c和%s讀入字符或字符串時,應在地址參數後附加一個緩衝區邊界值。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章