C 为什么我的'+';运算符是否被视为新行字符?
以下代码用于模块化计算器问题。输入数据为: 5 +3 * 7 +10 * 2 * 3 +1 % 11 我似乎不明白为什么?替换C 为什么我的'+';运算符是否被视为新行字符?,c,newline,user-input,C,Newline,User Input,以下代码用于模块化计算器问题。输入数据为: 5 +3 * 7 +10 * 2 * 3 +1 % 11 我似乎不明白为什么?替换 oper=getchar(); fflush(stdin); scanf("%d",&number); 与 如果写入scanf(“%c”,&operator),则%c中%c之前的空格将在读取单个字符之前使用任意数量的空白字符 此外,匹配失败时,scanf将返回EOF。您可以将其用作while循环的条件 还有一个建议:在执行操作之前,将结果存储在previous
oper=getchar();
fflush(stdin);
scanf("%d",&number);
与
如果写入scanf(“%c”,&operator)
,则%c
中%c
之前的空格将在读取单个字符之前使用任意数量的空白字符
此外,匹配失败时,scanf
将返回EOF
。您可以将其用作while
循环的条件
还有一个建议:在执行操作之前,将结果
存储在previous
变量中,以便在操作之前和之后打印值。这将产生用户友好的输出
#include <stdio.h>
int main(void) {
char operator;
int number, previous, result;
scanf("%d", &number);
result = number;
while (scanf(" %c", &operator) != EOF) {
previous = result;
scanf("%d", &number);
if (operator == '+') {
result += number;
} else if (operator == '-') {
result -= number;
} else if (operator == '*') {
result *= number;
} else if (operator == '/') {
result /= number;
} else if (operator == '%') {
result %= number;
}
printf("%d %c %d = %d\n", previous, operator, number, result);
}
return 0;
}
#包括
内部主(空){
字符算子;
整数,前一个,结果;
scanf(“%d”和编号);
结果=数量;
while(scanf(“%c”,&operator)!=EOF){
先前=结果;
scanf(“%d”和编号);
if(运算符=='+'){
结果+=数字;
}else if(运算符=='-'){
结果-=数量;
}else if(运算符=='*'){
结果*=数字;
}else if(运算符=='/')){
结果/=数字;
}else if(运算符=“%”){
结果%=数量;
}
printf(“%d%c%d=%d\n”,上一个,运算符,编号,结果);
}
返回0;
}
一般来说,我发现对于所有基于用户的输入,使用fgets()
比使用scanf()
/getchar()
更好(或者,如果您使用的是C99,获取s()
——尽管我仍然更喜欢使用fgets()
,以最大限度地提高对旧编译器环境的可移植性),如果需要,则使用anfsc()
,strtol()
(等)将字符串转换为其他数据类型,因为这将以缓冲区安全的方式逐行读取数据,并且您不必担心输入缓冲区中留下的东西这对于基于用户的输入尤其如此,因为这些输入的格式永远都不正确(由于打字错误等)<代码>扫描()
考虑到这一点,我将更像这样编写代码:
#include <stdio.h>
int main(void) {
char buf[80];
char oper;
int number,result;
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d",&number);
printf(" saw input: %d\n", number );
result=number;
do
{
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%c %d",&oper, &number);
printf(" saw input: %c %d\n", oper, number );
printf(" computing: %d %c %d\n", result, oper, number );
if(oper=='+') {
result=result+number;
}
else if(oper=='*') {
result=result*number;
}
else if(oper=='%') {
result=result%number;
}
printf(" result : %d\n", result );
} while( oper!='%' );
return 0;
}
#包括
内部主(空){
char-buf[80];
字符操作器;
整数,结果;
fgets(buf、sizeof(buf)、stdin);
sscanf(基本单位,“%d”和编号);
printf(“saw输入:%d\n”,编号);
结果=数量;
做
{
fgets(buf、sizeof(buf)、stdin);
sscanf(基本单位、%c%d、&oper、&number);
printf(“saw输入:%c%d\n”,操作,编号);
printf(“计算:%d%c%d\n”,结果、操作、编号);
如果(操作=='+'){
结果=结果+数字;
}
else if(oper=='*'){
结果=结果*编号;
}
else if(oper=='%'){
结果=结果%number;
}
printf(“结果:%d\n”,结果);
}而(oper!='%');
返回0;
}
请注意,doingfflush(stdin)
是一些运行库的扩展,在C规范中被显式标记为未定义行为。至于您的问题,换行符本身就是一个字符,因此当然会返回它。还要注意,它返回的是int
。我尝试了scanf(%C%d),&oper,&number);。这也不起作用。您的输入文本是“5\n3+\n*7\n”
。。。那些\n
字符就在那里,它们正被getchar()
读取。非常感谢!成功了。但现在我在处理海量数据时遇到了麻烦。Long int、double和float值不能提供所需的输出。@如果使用double number,则返回结果代码>,使用scanf(“%lf”和编号);printf(“%f”,数字)代码>,当长整数时代码>然后scanf(“%ld”和编号);printf(“%ld”,数字)代码>
scanf(" %c", &oper);
scanf("%d", &number);
#include <stdio.h>
int main(void) {
char operator;
int number, previous, result;
scanf("%d", &number);
result = number;
while (scanf(" %c", &operator) != EOF) {
previous = result;
scanf("%d", &number);
if (operator == '+') {
result += number;
} else if (operator == '-') {
result -= number;
} else if (operator == '*') {
result *= number;
} else if (operator == '/') {
result /= number;
} else if (operator == '%') {
result %= number;
}
printf("%d %c %d = %d\n", previous, operator, number, result);
}
return 0;
}
#include <stdio.h>
int main(void) {
char buf[80];
char oper;
int number,result;
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d",&number);
printf(" saw input: %d\n", number );
result=number;
do
{
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%c %d",&oper, &number);
printf(" saw input: %c %d\n", oper, number );
printf(" computing: %d %c %d\n", result, oper, number );
if(oper=='+') {
result=result+number;
}
else if(oper=='*') {
result=result*number;
}
else if(oper=='%') {
result=result%number;
}
printf(" result : %d\n", result );
} while( oper!='%' );
return 0;
}