我是C编程的新手,我刚刚创建了一个小型计算器应用程序,但我注意到当我在读取Int Values后读取char值时,下一个Int变量将发生更改。发生这种情况的原因是什么?这是我的代码
{
"error": true,
"message": "Error while insertion. Erron in the query",
"data": "An exception occurred while executing 'INSERT INTO \"user\" (...) VALUES (...)' with params [...]:\n\nSQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for integer: \"default\"" }
答案 0 :(得分:1)
此处您必须使用scanf("%c", &opr);
而不是scanf("%s", &opr);
,因为 opr 是char
,因此您必须使用%c
,{{1} }用于扫描String。然后出现未处理的%s
问题。因此,在'\n'
的前面添加一个额外的'\n'
,因此该语句变为%c
;
修改后的代码:-
scanf("\n%c", &opr);
输出:-
#include <stdio.h>
int main()
{
int num1;
int num2;
char opr;
int ans;
printf("Enter the first number : ");
scanf("%d", &num1);
printf("Enter the second number : ");
scanf("%d", &num2);
printf("Enter the operater : ");
scanf("\n%c", &opr); // not scanf("%s", &opr);
printf("%d \n", num1);
printf("%d \n", num2);
switch (opr)
{
case '+':
ans = num1 + num2;
printf("The addtion of %d and %d is %d", num1, num2, ans);
printf("\n");
break;
case '-':
ans = num1 - num2;
printf("The substractuon of %d from %d is %d", num2, num1, ans);
printf("\n");
break;
case '*':
ans = num1 * num2;
printf("The multiplication of %d and %d is %d", num1, num2, ans);
printf("\n");
break;
case '/':
ans = num1 / num2;
printf("The substraction of %d from %d is %d", num1, num2, ans);
printf("\n");
break;
}
return 0;
}
答案 1 :(得分:0)
使用scanf("%c", &opr)
读取单个char
。
使用%s
将读取以NUL结尾的字符串,但是只有一个字节不足,这将导致不确定的行为。
实际上是在将NUL终止符写在int
旁边的opr
变量的最高一个字节上。
答案 2 :(得分:-1)
如其他人所述,使用%c
读取一个字符:
但是您使用了%s
,所以发生的事情是scanf读取了一个字符串。假设您的示例输入的内容为普通字符,将读取一个字符和一个换行符。然后,Scanf写入char和给定地址的终止0字节,这就是您的char。
但是一个字符只有一个字节大,另一个字符溢出到存储器中的下一个字节。在您的情况下,这恰好是int变量。这被称为缓冲区溢出,是使用scanf的危险之一。