scanf 后输入数字重置为 0
Input number resets to 0 after scanf
我有一个奇怪的问题。我要求用户输入 1 到 15 之间的数字。然后我会询问用户是否愿意使用递归或 for 循环获取数字的阶乘值。
当他们回答该问题时,输入的值变为 0。如果我出于测试目的删除问题,该值将保持用户输入的值。
#include <stdio.h>
int recursive(int);
int nonRecursive(int);
int main()
{
/* Variables */
int numberSelected, returnedValue;
char answer;
do
{
/* Request a number between 1 and 15 */
printf("Please enter a number between 1 and 15: ");
scanf("%d", &numberSelected);
printf("%d\n", numberSelected); /* This prints out the user's number */
}while(numberSelected < 1 || numberSelected > 15); /* Loops if the value is not between 1 and 15 */
/* Ask user if they want to return a recursive value or a value calculated manually */
printf("Would you like a recusive value of the number you entered? Y or N: ");
scanf("%s", &answer);
if(answer == 'y' || answer == 'Y')
{
printf("%d\n", numberSelected); /* Here it resets to 0 */
returnedValue = recursive(numberSelected); /* Returns the recursive value */
printf("The recursive value of %d is %d\n", numberSelected, returnedValue);
}
else
{
printf("%d\n", numberSelected); /* Here it resets to 0 also*/
returnedValue = nonRecursive(numberSelected); /* Returns the value from for loop */
printf("The non recursive value of %d is %d\n", numberSelected, returnedValue);
}
return 0;
}
/* Get value using recursive */
int recursive(int n)
{
if (n == 0)
return 1; // Base case
else
return n * recursive(n - 1);
}
/* Get value using for loop */
int nonRecursive(int n)
{
int i;
int fact = 1;
for(i = 1; i <= n; i++)
{
fact *= i;
}
return fact;
}
感谢您的帮助
scanf("%s", &answer);
错了。 %s
用于读取字符串(null-terminated sequence of characters),但是answer
只有1个字符的空间,所以当读取一个或多个字符的字符串时会出现越界写。它可能会破坏相关数据。
该行应该是
scanf(" %c", &answer);
- 使用
%c
,读取单个字符。
- 在
%c
之前添加 space 以使 scanf()
忽略白色 space 字符。
我有一个奇怪的问题。我要求用户输入 1 到 15 之间的数字。然后我会询问用户是否愿意使用递归或 for 循环获取数字的阶乘值。 当他们回答该问题时,输入的值变为 0。如果我出于测试目的删除问题,该值将保持用户输入的值。
#include <stdio.h>
int recursive(int);
int nonRecursive(int);
int main()
{
/* Variables */
int numberSelected, returnedValue;
char answer;
do
{
/* Request a number between 1 and 15 */
printf("Please enter a number between 1 and 15: ");
scanf("%d", &numberSelected);
printf("%d\n", numberSelected); /* This prints out the user's number */
}while(numberSelected < 1 || numberSelected > 15); /* Loops if the value is not between 1 and 15 */
/* Ask user if they want to return a recursive value or a value calculated manually */
printf("Would you like a recusive value of the number you entered? Y or N: ");
scanf("%s", &answer);
if(answer == 'y' || answer == 'Y')
{
printf("%d\n", numberSelected); /* Here it resets to 0 */
returnedValue = recursive(numberSelected); /* Returns the recursive value */
printf("The recursive value of %d is %d\n", numberSelected, returnedValue);
}
else
{
printf("%d\n", numberSelected); /* Here it resets to 0 also*/
returnedValue = nonRecursive(numberSelected); /* Returns the value from for loop */
printf("The non recursive value of %d is %d\n", numberSelected, returnedValue);
}
return 0;
}
/* Get value using recursive */
int recursive(int n)
{
if (n == 0)
return 1; // Base case
else
return n * recursive(n - 1);
}
/* Get value using for loop */
int nonRecursive(int n)
{
int i;
int fact = 1;
for(i = 1; i <= n; i++)
{
fact *= i;
}
return fact;
}
感谢您的帮助
scanf("%s", &answer);
错了。 %s
用于读取字符串(null-terminated sequence of characters),但是answer
只有1个字符的空间,所以当读取一个或多个字符的字符串时会出现越界写。它可能会破坏相关数据。
该行应该是
scanf(" %c", &answer);
- 使用
%c
,读取单个字符。 - 在
%c
之前添加 space 以使scanf()
忽略白色 space 字符。