接受一个浮点数和一个数学运算符
C++ TCP Client - accept a floating point number and a mathematical operator
这就是我需要帮助完成的:提示用户并接受浮点数,提示用户并接受数学运算符(+,- *,/),提示用户并接受另一个浮点数。这是我的客户端代码。我有一个服务器代码,我需要这个程序发送的数据进行处理,然后显示结果。我可以张贴我的服务器代码,如果需要的话。请帮助!
#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: %dn", 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 PortNumbern");
return;
}
nPort = atoi(argv[2]);
//
// Initialize WinSock and check the version
//
nRet = WSAStartup(wVersionRequested, &wsaData);
if (wsaData.wVersion != wVersionRequested)
{
fprintf(stderr,"n Wrong versionn");
return;
}
//
// Go do all the stuff a datagram client does
//
StreamClient(argv[1], nPort);
//
// Release WinSock resources
//
WSACleanup();
}
////////////////////////////////////////////////////////////
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;
}
您的网络代码看起来不错,尽管我不是这方面的专家。提示用户输入非常简单。既然你在你的问题中使用了c风格的I/O,我也将使用c风格的I/O,即使你的问题被标记为C++
。
将输出写入控制台,使用printf
:
printf("nPlease enter a floating point number: ");
(n
将输出换行符)
要从控制台读取输出,使用scanf
:
float number1;
scanf("%f", &number1);
这里的字符串"%f"
表示我们正在读取一个浮点数。第二个参数是指向浮点数的指针,我们希望将答案存储在浮点数中。有关scanf
的更多信息,请参见cplusplus-reference。
您可以以类似的方式提示其他输入。完整代码:
printf("nPlease enter a floating point number: ");
float number1;
scanf("%f", &number1);
printf("nPlease enter a mathematical operator (+,-,*,/): ");
char mathOperator;
scanf("%c", &mathOperator);
if( mathOperator != '+' && mathOperator!= '-' && mathOperator!= '*' && mathOperator!= '/' )
{
//your error handling here
}
printf("nPlease enter a floating point number: ");
float number2;
scanf("%f", &number2);
printf("nCalculating %f %c %f...", &number1, &mathOperator, &number2);
//now send data to server
在printf
的最新示例中,您还可以看到,您可以以与读取值类似的方式将值写入输出,并且可以在单个命令中拥有多个值。有关printf
的更多信息,请参阅cplusplus-reference。
相关文章:
- 一个关于在C++中重载布尔运算符的问题
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 为 std::variant 提供一个运算符 ==
- 一元*运算符的操作数是否期望一个 prvalue
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 运算符重载:"operator+"必须采用零个或一个参数
- 重载运算符*以获取对另一个类的实例的引用
- 使用 scope 运算符 (::) 引用另一个文件中的类
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 在一个指令中声明更多指针的运算符优先级
- 为什么有条件编译运算符模板会更改另一个运算符的可用性?
- 我重载了一个运算符*()函数来计算两个矩阵的总和,但编译器提示此错误
- 基于范围的循环使用另一个运算符
- 在C++中,我可以使用箭头运算符访问另一个运算符吗
- 卡住了---用C++创建一个运算符模板
- 为什么一个运算符的操作数需要具有相同的类型
- 是否可以为 C++ 的字符串类创建一个运算符+函数?并连接"literals"?
- 如何为 boost::tuple 编写一个 '<<' 运算符?