将char数组添加到C 中的字符串

Adding char array to string in c++

本文关键字:字符串 char 数组 添加      更新时间:2023-10-16
char site[];
scanf("%s", site);
send(sock,"GET / HTTP/1.1rnHost: " + site + "rnConnection: closernrn", strlen("GET / HTTP/1.1rnHost: " + site + "rnConnection: closernrn"),0);

这给了我错误:表达式必须具有积分或枚举类型。

我该如何修复?

正如其他答案中所述,您发布的代码是直接的。在C 中,您通常会喜欢std ::字符串到C-style Char Arrays and std :: cin到C - 风格的scanf()。更C 的方式看起来像这样

std::string input;
std::cin >> input;
std::string out = "GET / HTTP/1.1rnHost: " + input + "rnConnection: closernrn";
send(sock, out.c_str(), out.size(), 0);

尽管标记为C ,但代码是直接的。有两个问题:首先,site是不完整的类型;您需要给它一个尺寸;其次,在C中,您不能仅仅与' '一起堵塞字符串。您需要使用strcat

char site[128];
char cmd[128];
scanf("%s", site);
strcpy(cmd, "GET / HTTP/1.1rnHost: ");
strcat(cmd, site);
strcat(cmd, "rnConnection: closernrn");

这不是对样式的认可(也不是 r n的东西),只是一个简单的代码块,它可以执行原始内容。

更改以下内容: "GET / HTTP/1.1rnHost: " + site + "rnConnection: closernrn", strlen("GET / HTTP/1.1rnHost: " + site + "rnConnection: closernrn"

(std::string() +"GET / HTTP/1.1rnHost: " + site + "rnConnection: closernrn", strlen("GET / HTTP/1.1rnHost: " + site + "rnConnection: closernrn").c_str()

绝对最小的更改使该行编译并执行您可能想要的事情。

操作员 在RAW C字符串上没有做任何您想做的事情。通过从std :: string()开始,添加RAW C字符串创建了新的std :: strings。然后,我们在末尾致电.c_str()返回到一个原始的C字符串,该c字符串至少持续到您调用完成功能为止。然后一切都清理了。

现在,您的代码还有其他问题。char site[]; scanf("%s", site);调用了未定义的行为,因为编译器不知道site数组应该有多大。即使您给site尺寸(例如char site[100];),这将是一个缓冲区跨流,等待发生 - 不建议使用scanf

读取字符串时,您要么需要一个将您阅读的量的函数限制为正在阅读的缓冲区,要么根据需要调整缓冲区以适合您正在阅读的内容。

请注意,我假设代码实际上是C ,如标记。

char site[];

此代码不合法。您的编译器应产生错误,例如:

main.cpp:5:10: error: definition of variable with array type needs an explicit size or an initializer
    char site[];
         ^

因为在C 中,内置阵列具有固定大小,这是其类型的一部分。如果您想要一个可重大的数组,则应将std::vector用于一般情况,而std::string用于字符串。

scanf("%s", site);

如果char site[]正在使用您的编译器,则可能会创建一个大小为零的数组,因此在其中读取任何内容会导致缓冲区溢出。

send(sock,"GET / HTTP/1.1rnHost: " + site + "rnConnection: closernrn", strlen("GET / HTTP/1.1rnHost: " + site + "rnConnection: closernrn"),0);

这应该导致沿着:

的线路发生另一个错误
main.cpp:10:42: error: invalid operands to binary expression ('const char *' and 'char *')
    send(sock,"GET / HTTP/1.1rnHost: " + site + "rnConnection: closernrn", strlen("GET / HTTP/1.1rnHost: " + site + "rnConnection: closernrn"),0);
              ~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~

在C 中,您不能简单地将数组添加在一起。同样,C 中的数组是固定尺寸的对象。但是,您可以将std::strings添加在一起,也可以使用const char *添加std::string(因为STD :: String定义了自身和const char *之间的operator+)。

std::string site;
site = getURL(); // you'll have to implement this, including both getting the string from the user and validating that the user isn't entering in something tricky that will cause security problems
std::string query = "GET / HTTP/1.1rnHost: " + site + "rnConnection: closernrn";
send(sock, query.c_str(), query.size());

另一个GET实现。

    char *get_http= new char[256];
    memset(get_http,' ', sizeof(get_http) );
    strcpy(get_http,"GET / HTTP/1.1rnHost: ");
    strcat(get_http,url);
    strcat(get_http,"rnConnection: closernrn");
            .
            .
    send(Socket,get_http, strlen(get_http),0 );

示例winsock控制台HTML浏览器代码:

#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cctype>
#include <locale>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
string website_HTML;
locale local;
//***************************
void get_Website(char *url );
//***************************

int main ()
{
    get_Website("www.msn.com" );
    for (size_t i=0; i<website_HTML.length(); ++i) website_HTML[i]= tolower(website_HTML[i],local);
    cout <<website_HTML;
    cout<<"nn";

    return 0;
}

//***************************
void get_Website(char *url )
{
    WSADATA wsaData;
    SOCKET Socket;
    SOCKADDR_IN SockAddr;

    int lineCount=0;
    int rowCount=0;
    struct hostent *host;
    char *get_http= new char[256];
        memset(get_http,' ', sizeof(get_http) );
        strcpy(get_http,"GET / HTTP/1.1rnHost: ");
        strcat(get_http,url);
        strcat(get_http,"rnConnection: closernrn");
        if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) 
        {
            cout << "WSAStartup failed.n";
            system("pause");
            //return 1;
        }
        Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        host = gethostbyname(url);
        SockAddr.sin_port=htons(80);
        SockAddr.sin_family=AF_INET;
        SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
        cout << "Connecting to "<< url<<" ...n";
        if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0)
        {
            cout << "Could not connect";
            system("pause");
            //return 1;
        }
        cout << "Connected.n";     
        send(Socket,get_http, strlen(get_http),0 );
        char buffer[10000];
        int nDataLength;
            while ((nDataLength = recv(Socket,buffer,10000,0)) > 0)
            {       
                int i = 0;
                while (buffer[i] >= 32 || buffer[i] == 'n' || buffer[i] == 'r') 
                {                    
                    website_HTML+=buffer[i];                     
                    i += 1;
                }               
            }
        closesocket(Socket);
        WSACleanup();
            delete[] get_http;
}
相关文章: