2013-03-17 97 views
0

用戶輸入2個數字,然後輸入+, - ,/,*並且應該得到回答。問題是,它沒有顯示正確輸入的內容,也沒有計算。爲什麼是這樣?我提供了一個截圖來顯示我所得到的。我該如何解決? http://imageshack.us/photo/my-images/404/mathfn.jpg/TCP客戶端數學操作無法正常工作

#include <iostream> 
using namespace std; 

#include <stdio.h> 
#include <string.h> 
#include <winsock.h> 

// Function prototype 
void StreamClient(char *szServer, short nPort); 

// Helper macro for displaying errors 
#define PRINTERROR(s) \ 
     fprintf(stderr,"\n%s: %d\n", s, WSAGetLastError()) 

//////////////////////////////////////////////////////////// 

void main(int argc, char **argv) 
{ 
    WORD wVersionRequested = MAKEWORD(1,1); 
    WSADATA wsaData; 
    int nRet; 
    short nPort; 

    // 
    // Check for the host and port arguments 
    // 
    if (argc != 3) 
    { 
     fprintf(stderr,"\nSyntax: TCPTimeClient ServerName PortNumber\n"); 
     return; 
    } 

    nPort = atoi(argv[2]); 

    // 
    // Initialize WinSock and check the version 
    // 
    nRet = WSAStartup(wVersionRequested, &wsaData); 
    if (wsaData.wVersion != wVersionRequested) 
    { 
     fprintf(stderr,"\n Wrong version\n"); 
     return; 
    } 

    // 
    // Go do all the stuff a datagram client does 
    // 
    StreamClient(argv[1], nPort); 

    // 
    // Release WinSock resources 
    // 
    WSACleanup(); 

    printf("\nPlease enter a floating point number: "); 
float number1; 
scanf("%f", &number1); 

printf("\nPlease enter a mathematical operator (+,-,*,/): "); 
char mathOperator; 
scanf("%f", &mathOperator); 


printf("\nPlease enter a floating point number: "); 
float number2; 
scanf("%f", &number2); 

printf("\nCalculating %f %f %f...", &number1, &mathOperator, &number2); 

printf("\nPlease enter a floating point number: "); 
float number3; 
scanf("%f", &number2); 

} 

//////////////////////////////////////////////////////////// 

void StreamClient(char *szServer, short nPort) 
{ 
    int nRet;      // return code 
    char szBuf[256];    // client buffer area 
    char szSvr[256];    // server name 

    LPHOSTENT lpHostEntry;   // host data structure 
    SOCKET theSocket;    // client socket 
    SOCKADDR_IN saClient;   // socket address structure 

    // 
    // Get local machine name 
    // 
    nRet = gethostname(szSvr, sizeof(szSvr)); 

    // 
    // Check for errors 
    // 
    if (nRet == SOCKET_ERROR) 
    { 
     PRINTERROR("gethostname()"); 
     return; 
    } 

    // 
    // Display an informational message 
    // 
    printf("Datagram Client [%s] sending to server [%s] on port %d...\n", 
           szSvr, szServer, nPort); 

    // 
    // Find the server 
    // 
    lpHostEntry = gethostbyname(szServer); 
    if (lpHostEntry == NULL) 
    { 
     PRINTERROR("gethostbyname()"); 
     return; 
    } 

    // 
    // Create a TCP/IP datagram socket 
    // 
    theSocket = socket(AF_INET,   // Address family 
         SOCK_STREAM,  // Socket type 
         0);    // Protocol 

    // 
    // Check for errors 
    // 
    if (theSocket == INVALID_SOCKET) 
    { 
     PRINTERROR("socket()"); 
     return; 
    } 

    // 
    // Fill in the address structure of the server 
    // 
    saClient.sin_family = AF_INET; 
    saClient.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list); 
             //^Client's address 
    saClient.sin_port = htons(nPort); // Port number from command line 

    // 
    // Connect to the server 
    // 
    nRet = connect(theSocket, 
      (struct sockaddr *)&saClient, 
      sizeof(saClient)); 

    // 
    // Check for errors 
    // 
    if(nRet == SOCKET_ERROR) 
    { 
     PRINTERROR("Connect()"); 
     return; 
    } 

    // 
    // Prepare some data to send to the server 
    // 
    sprintf(szBuf, "From the Client [%s]", szSvr); 

    // 
    // Send data to the server 
    // 
    nRet = send(theSocket,     // Socket 
        szBuf,     // Data buffer 
        (int)strlen(szBuf),  // Length of data 
        0);      // Flags 

    // 
    // Check for errors 
    // 
    if (nRet == SOCKET_ERROR) 
    { 
     PRINTERROR("send()"); 
     closesocket(theSocket); 
     return; 
    } 

    // 
    // Zero out the incoming data buffer 
    // 
    memset(szBuf, 0, sizeof(szBuf)); 

    // 
    // Wait for the reply 
    // 
    nRet = recv(theSocket,     // Socket 
       szBuf,      // Receive buffer 
       sizeof(szBuf),    // Length of receive buffer 
       0);       // Flags 

    // 
    // Check for errors 
    // 
    if (nRet == SOCKET_ERROR) 
    { 
     PRINTERROR("recv()"); 
     closesocket(theSocket); 
     return; 
    } 

    // 
    // Display the data that was received 
    // 
    printf("\n%s", szBuf); 

    // 
    // Close the socket 
    // 
    closesocket(theSocket); 
    return; 


} 
+0

您應該已經爲您自己解決這是計算問題還是網絡問題,然後再發布。 – EJP 2013-03-18 00:02:25

+0

1)main應該返回int 2)C沒有名字空間3)WORD是什麼? – wildplasser 2013-03-18 00:12:36

+0

這是C++,而不是C.使用命名空間和iostream的東西。 – 2013-03-18 00:17:44

回答

1

我不明白爲什麼你不能輸入炭,所以我創建了一個測試程序 - 果然相同的行爲!我不scanf()很多,但我猜想scanf(「%c」)是抓住緩衝區中的任何字符 - 如果有的話 - 並繼續之前,我們有機會進入任何東西。所以我完全明確地說 - 爲fscanf/fgetchar流指定'stdin'並在讀取之前執行fflush()以確保它是空的。此外,我完全停止使用scanf()來獲取單個字符。就是這樣!下面是完整的程序:

printf("Please enter a floating point number: "); 
float number1; 
fscanf(stdin,"%f", &number1); 

printf("Please enter a mathematical operator (+,-,*,/): "); 
char mathOperator; 
//fscanf(stdin,"%f", &mathOperator); 

fflush(stdin); 
mathOperator = (char)fgetc(stdin); 

printf("Please enter a floating point number: "); 
float number2; 
fscanf(stdin,"%f", &number2); 

printf("\nCalculating %f %c %f...", number1, mathOperator, number2); 

float result = 0.0F; 
switch (mathOperator) { 
case '+': 
    result = number1 + number2; 
    break; 
case '-': 
    result = number1 - number2; 
    break; 
case '/': 
    result = number1/number2; 
    break; 
case '*': 
    result = number1 * number2; 
    break; 
default: 
    printf("\nInvalid operator entered!"); 
} 

printf("\n\nThe answer is %0.1f\n", result); 

fflush(stdin); 
char ch = getc(stdin); // wait for keypress 

而這裏的測試運行的輸出:

Please enter a floating point number: 3.4 
Please enter a mathematical operator (+,-,*,/): * 
Please enter a floating point number: 2 

Calculating 3.400000 * 2.000000... 

The answer is 6.8 

[結束更新]

你和printf(有)的具體問題是:你傳遞的是浮點值的地址 - 而不是值本身。

printf("\nCalculating %f %f %f...", &number1, &mathOperator, &number2); 

應該是:

printf("\nCalculating %f %f %f...", number1, mathOperator, number2); 

下一個問題是「mathOperator」 - 它看起來像你要求用戶輸入一個字符,但INT中的printf指定的數據類型()是浮動。這是行不通的。

所以printf的真的應該更像:

printf("\nCalculating %f %c %f...", number1, mathOperator, number2); 

假設 'mathOperator' 有一個 '+', - 在這等'。至於爲什麼它不計算 - 我沒有看到(也許它只是爲了簡潔而省略)任何代碼來實際進行計算。

[計算更新]

由於只允許運營商是 '+', ' - ', '/', '*',總是漂浮在操作數中,計算邏輯是非常簡單的:

float result = 0.0F; 
switch (mathOperator) { 
case '+': 
    result = number1 + number2; 
    break; 
case '-': 
    result = number1 - number2; 
    break; 
case '/': 
    result = number1/number2; 
    break; 
case '*': 
    result = number1 * number2; 
    break; 
} 

然後,你可能會想添加一個printf()輸出結果(和/或將其發回通過TCP):

printf("The answer is" "%0.1f\n", result); 

如果你進入,你不必擔心OPERAT票友計算或優先級,類型轉換等。一個簡單的「案例」是不夠的。你會想看解析器從表達式構建一個分析樹,並根據一些規則(語法)對其進行評估。但相信我 - 你想首先這個 ;-)

看到這個question瞭解涉及到什麼。

+0

謝謝,現在它顯示正常。但是,不,我沒有遺漏代碼來進行計算。我不知道如何實際執行。特別是因爲用戶可以決定是否加法,減法等等,但是如果我可以得到這個工作,這將是一個巨大的幫助! – 2013-03-18 00:12:45

+0

@BillStack查看編輯原始答案。 – 2013-03-18 00:53:25

+0

由於某些原因,答案只顯示爲0?我認爲出於某種原因,該程序不能識別操作員正在選擇什麼。 – 2013-03-18 01:49:03