尝试在循环中使用scanf扫描值。需要辅助输入来打印第一个输入

尝试在循环中使用scanf扫描值。需要辅助输入来打印第一个输入,c,while-loop,user-input,scanf,C,While Loop,User Input,Scanf,我在使用scanf时遇到了麻烦(在别人提到它之前,我必须使用它。我不能使用getchar(),fgets(),以及其他各种东西)。在下面的代码中,我需要加(或减)两个实数或整数,并将总和存储到内存中。我想我可以自己整理内存,但问题是打印总和的结果 我必须键入“6+6”,按enter键,然后输入另一个字符以显示原始总和。此外,如果我键入“6+6+”,程序将运行,我希望它运行 我想我犯了一个非常基本的错误。我很累 #include <stdio.h> #include <stdli

我在使用scanf时遇到了麻烦(在别人提到它之前,我必须使用它。我不能使用
getchar()
fgets()
,以及其他各种东西)。在下面的代码中,我需要加(或减)两个实数或整数,并将总和存储到内存中。我想我可以自己整理内存,但问题是打印总和的结果

我必须键入“6+6”,按enter键,然后输入另一个字符以显示原始总和。此外,如果我键入“6+6+”,程序将运行,我希望它运行

我想我犯了一个非常基本的错误。我很累

#include <stdio.h>
#include <stdlib.h>

int main(){
  char memoryExitSwitch[256];
  int q =1;
  double operandOneHalf;
  double operandTwo;
  double result = 0.0;

  while(q == 1){
    scanf("%lf"  "%lf ", &operandOneHalf, &operandTwo);
    scanf( " %s", memoryExitSwitch);

    switch (memoryExitSwitch[0]) {
      case 'p':
        result = memoryExitSwitch[1] + operandTwo;
        printf("ANS1= %lf\n", result);
        memoryExitSwitch[1] = result;
        break;

      case 'q':
        q = 0;
        break;

      default:
        result = operandOneHalf + operandTwo;
        printf("ANS2= %lf\n", result);
        memoryExitSwitch[1] =  result;
        break;
    }//switch

  }//main while loop q
  return 0;
}
#包括
#包括
int main(){
char memoryExit开关[256];
int q=1;
双操作数半;
双操作数2;
双结果=0.0;
而(q==1){
scanf(“%lf”%lf“,&operanonehalf,&operandotwo);
scanf(“%s”,MemoryExit开关);
开关(MemoryExit开关[0]){
案例“p”:
结果=MemoryExit开关[1]+操作数2;
printf(“ANS1=%lf\n”,结果);
MemoryExit开关[1]=结果;
打破
案例‘q’:
q=0;
打破
违约:
结果=操作数一半+操作数二;
printf(“ANS2=%lf\n”,结果);
MemoryExit开关[1]=结果;
打破
}//开关
}//主回路q
返回0;
}

由于第二个
%lf
后面的尾随空格,您的程序将在第二个数字后面等待一个非空白字符:

scanf("%lf"  "%lf ", &operandOneHalf, &operandTwo);
…如果您解决了这个问题,它仍将等待在两个数字之后输入一个非空白字符串,因为下面调用了
scanf()


您的程序在第二个数字后等待一个非空白字符,因为第二个
%lf
后面有尾随空格:

scanf("%lf"  "%lf ", &operandOneHalf, &operandTwo);
…如果您解决了这个问题,它仍将等待在两个数字之后输入一个非空白字符串,因为下面调用了
scanf()

各种问题

  • 尾随空格
    “%lf”
    强制
    scanf()
    检测数字后面的非空白,延迟
    scanf()
    返回。
    表示使用所有可选的下列空白
    scanf()
    需要查看一些非空白,才能知道它已看到以下所有空白

    // scanf("%lf"  "%lf ", &operandOneHalf, &operandTwo);
    //                   v--- no space
    if (scanf("%lf"  "%lf", &operandOneHalf, &operandTwo) != 2) return -1;
    
  • 好的代码限制输入宽度以防止缓冲区溢出

    char memoryExitSwitch[256];
    // scanf( " %s", memoryExitSwitch);
    //          v ---- space not needed
    //          |255 - lit input to 1 less than buffer size
    //          | |                           v--- Check result
    if (scanf( "%255s", memoryExitSwitch) != 1) return -1;
    
  • 各种问题

  • 尾随空格
    “%lf”
    强制
    scanf()
    检测数字后面的非空白,延迟
    scanf()
    返回。
    表示使用所有可选的下列空白
    scanf()
    需要查看一些非空白,才能知道它已看到以下所有空白

    // scanf("%lf"  "%lf ", &operandOneHalf, &operandTwo);
    //                   v--- no space
    if (scanf("%lf"  "%lf", &operandOneHalf, &operandTwo) != 2) return -1;
    
  • 好的代码限制输入宽度以防止缓冲区溢出

    char memoryExitSwitch[256];
    // scanf( " %s", memoryExitSwitch);
    //          v ---- space not needed
    //          |255 - lit input to 1 less than buffer size
    //          | |                           v--- Check result
    if (scanf( "%255s", memoryExitSwitch) != 1) return -1;
    

  • 您是否尝试在switch语句之前打印出
    memoryExitSwitch
    ?在第一个
    svanf()
    的格式字符串中有一个尾随空格;这是个大问题。直到您键入一个非空值,它才会停止。您是否尝试过在switch语句之前打印出
    memoryExitSwitch
    ?在第一个
    svanf()的格式字符串中有一个尾随空格;这是个大问题。它不会停止,直到你键入一个非空的;另一个是问题所在。“您的程序等待非空白字符串”-->
    scanf(“%s”,memoryExitSwitch)
    scanf(“%s”,memoryExit开关)具有相同的效果@JonathanLeffler:他们两个都是问题所在。如果
    %lf
    后面的空格是固定的,那么下面的
    scanf()
    仍然会等待字符串满足
    %s
    @chux:Yes,并且它们都会等待一些非空白满足
    %s
    。实际上,不是。这是第一个主要问题。直到用户键入一些非空白字符,它才会完成。是的,在结束第一次输入的字符后还必须有某种形式的空格(例如换行符),但主要问题仍然是第一个
    scanf()
    。你可以输入任意多的换行、制表符和空格,但第一个仍然没有完成;另一个是问题所在。“您的程序等待非空白字符串”-->
    scanf(“%s”,memoryExitSwitch)
    scanf(“%s”,memoryExit开关)具有相同的效果@JonathanLeffler:他们两个都是问题所在。如果
    %lf
    后面的空格是固定的,那么下面的
    scanf()
    仍然会等待字符串满足
    %s
    @chux:Yes,并且它们都会等待一些非空白满足
    %s
    。实际上,不是。这是第一个主要问题。直到用户键入一些非空白字符,它才会完成。是的,在结束第一次输入的字符后还必须有某种形式的空格(例如换行符),但主要问题仍然是第一个
    scanf()
    。您可以键入任意多的换行符、制表符和空格,但第一个仍然没有完成。