2017-11-04 198 views
1

我最近開始學習C,我決定做一個計算器程序,是很容易的用戶使用:如何使下一個printf()在同一行上打印而不在下面?

#include"stdio.h" 

int main() 
{ 
    int a,b; 
    char c; 
    scanf("%d%c%d",&a,&c,&b); 
    switch(c) 
    { 
     case '+': 
     printf("=%d",a+b); 
     break; 

     case '-': 
     printf("=%d",a-b); 
     break; 

     case '*': 
     printf("=%d",a*b); 
     break; 

     case '/': 
     printf("=%d",a/b); 
     break; 

     case '%': 
     printf("=%d",a%b); 
     break; 

     default: 
     printf("\nWhat the heck is %c supposed to mean??",c); 
     break; 
    } 
    return 0; 
} 

然而,當我執行它,我得到這個問題。輸出語句得到如下一行打印,而不是繼續在同一行,即使我沒有在printf()命令使用\n

4/2 
=2 

我該如何解決這個問題,並在同一行上打印= 2打印?

+1

用戶類型的換行;你不能阻止這種情況的發生,因此你的程序的輸出發生在下一行。不過,您可以在單行上回顯所有輸入和結果。 –

+0

*「您可以在單行上回顯所有輸入以及結果。」*您能解釋一下您的意思嗎? –

+0

'的printf( 「%+%d =%d \ n」 個,A,B,A + B)' – Barmar

回答

0

你在第一線看到的是輸入用戶給到控制檯,而第二行是實際的printf(這實際上不打印任何換行符)。

當用戶輸入4/2他按下進入並是什麼,被打印到控制檯上。

如果你不希望這只是receciving他們以後的事情,用getchar()功能三次二送三個大字,並打印。儘管您必須添加一些複雜的代碼來識別第一個數字的結尾,第一個可操作字符+-*/和第二個數字的結尾(您可以使用空格字符)。這將最終打印您的輸入,如4/2 =2

或在上述意見中提到,

你可以真正做的是一些容易:打印輸入與像的輸出一起:printf("%d%c%d=%d",,a,c,b,a+b);但這種做法將在輸出真正實現,以及原始輸入到控制檯。

+0

*「你會雖然要忍受一點點複雜的代碼,以確定第一號結束,第一種運行字符+ - * /,第二個數字的結局*」將如何你建議在你的方法中確定「第二個數字的結尾」? – MFisherKDX

+0

哦,忘了提一下,空格字符可能會有所幫助。將在答案中加上這一點。 –

+3

在大多數系統中,'getchar()'在用戶按下返回鍵之前不會返回任何東西,直到損壞完成。您可以使用特定於平臺的「讀取單個字符而不等待換行」功能,這可能足以完成這項工作。但是您必須知道您正在使用哪個平臺來了解要使用哪個功能。 –

0

使用的termios:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <unistd.h> 
#include <termios.h> 


int main() 
{ 
    int a,b, i, j; 
    char c, str[10]; 
    struct termios term, term_orig; 
    if(tcgetattr(STDIN_FILENO, &term_orig)) { 
     printf("tcgetattr failed\n"); 
     return -1; 
    } 
    term = term_orig; 
    term.c_lflag &= ~ICANON; 
    term.c_lflag &= ~ECHO; 
    if (tcsetattr(STDIN_FILENO, TCSANOW, &term)) { 
      printf("tcsetattr failed\n"); 
      return (-1); 
    } 
    for (i =0; i < 3; i++)  
    { 
     switch (i) 
     { 
     case 0: 
      for(j = 0;; j++) 
      { 
       str[j] = getchar(); 
       if (isdigit(str[j])) 
        putchar(str[j]); 
       else 
        break;  
      } 
      str[j] =0; 
      a = atoi(str); 
      break; 
     case 1: 
     do { 
     c = fgetc(stdin); 
     } while (c == ' '); 
      putchar(c); 
     break; 

     case 2: 
     j = 0; 
     do { 
      str[j] = getchar(); 
      putchar(str[j]); 
     } while (str[j] == ' '); 
     for(j = 0;; j++) 
     { 
     str[j] = getchar(); 
     if (isdigit(str[j])) 
       putchar(str[j]); 
     else 
      break;  
     } 
     str[j] =0; 
     b = atoi(str); 
     break; 
    } 
} 
switch(c)//....... 


if (tcsetattr(STDIN_FILENO, TCSANOW, &term_orig)) { 
    printf("tcsetattr failed\n"); 
    return -1; 
    }