【发布时间】:2013-06-26 02:47:36
【问题描述】:
我真的很喜欢 %s,ID 的概念。我注意到这适用于 char,并且我知道这是 C 风格的功能。我想知道是否还有其他方法可以用字符串实现 %s:
这是我的代码:
#include "services.h"
#include <iostream>
using namespace std;
services::services()
{
}
services::~services()
{
}
int services::startup()
{
#if defined(WINDOWS)
{
WSAData data;
if(WSAStartup(MAKEWORD(2,2), &data) != 0)
exit(1);
}
#endif
int addresssize = sizeof(address);
address.sin_addr.s_addr = inet_addr("69.60.118.163");
address.sin_family = AF_INET;
address.sin_port = htons(6667);
sock = socket(AF_INET,SOCK_STREAM,0);
if(sock < 0)
return -1;
string PASSWORD = "password1";
string SERVER_NAME = "admin.services.net";
string SERVER_DESC = "Administration IRC Services";
if(connect(sock,(struct sockaddr *)&address,addresssize) == 0)
{
send_cmd("PASS ","%s\n",PASSWORD);
send_cmd("SERVER ","%s 1 %s\n",SERVER_NAME,SERVER_DESC);
return 0;
}
return -1; //ooops
}
void services::parseData()
{
char buffer[512];
stringstream convert;
string newbuffer;
for(;;)
{
int index = recv(sock,buffer,512-1,0);
buffer[index]='\0';
newbuffer = buffer;
cout << newbuffer.c_str() << endl;
if(index == 0)
{
cout << "Connection was closed!" << endl;
break;
}
system("pause");
}
}
void services::send_cmd(string cmd)
{
}
void services::send_cmd(string cmd, string param,...)
{
int bufsize;
string newmsg;
newmsg = (cmd += param);
cout << newmsg.c_str() << endl;
bufsize = sizeof(newmsg);
send(sock,newmsg.c_str(),strlen(newmsg.c_str()),0);
}
现在的问题是启动函数(在连接检查中)的 send_cmd 实际上给出了 %s 而不是密码/服务器信息的值
它只是在控制台中显示为“PASS %s”或“SERVER %s”——正如我所说,我喜欢 %s 的概念是否有其他方法可以实现这一点,或者只使用 send_cmd("PASS",PASSWORD); 代替(工作正常,我只是挑剔)
【问题讨论】:
-
send_cmd("PASS","%s\n",PASSWORD.c_str());
-
别忘了 send_cmd 也会发送一个字符串
-
将字符串(或任何其他非 POD 类类型的对象)作为变量参数之一传递给函数会产生未定义的行为。
-
很难看出这里要问什么。
send_cmd显然不是一个“printf-like”函数,它适用于像"%s"这样的格式字符串,所以不可能像写的那样工作。关于如何将send_cmd转换为这样的函数的教程太宽泛了。 你尝试过什么让send_cmd处理%s? -
与“\”字符不同,“%”字符对 C 或 C++ 编译器没有特殊意义,仅对“printf”系列函数具有特殊意义。