如何在C中正确使用字符串?

Bri*_*n D 2 c string strcat

像Java,Python和其他人一样毁了我.我正在尝试通过响应服务器代码来自动化FTP客户端:

例如:

// I know this is ugly, please bear with me

char username[25];
strcat(username, USER); //"USER "
strcat(username, usr); // "foo"
strcat(username, "\n"); // = "USER foo\n"

char password[25];
strcat(password, PASS); //"PASS "
strcat(password, pswd); //"bar"
strcat(password, "\n"); // = "PASS bar\n"


//read/write loop

while (1) { 

    char* responsePtr;
    serverCode = readSocket(sockfd, mybuffer);

    if (serverCode == 221) 
                    break;

    if (serverCode == 220)
        responsePtr = &username;

    if (serverCode == 331)
        responsePtr = &password;

    writeSocket(sockfd, responsePtr);

}
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,它适用于USER,但是我得到了一些PASS的错误文本:

C->S: USER anonymous
S->C: 331 Please specify the password.
C->S: (??_?PASS random
Run Code Online (Sandbox Code Playgroud)

谁能比我更聪明,更有经验给我一些C字符串指针?显然这对我没有用.

Joh*_*ica 12

在连接它们之前,需要初始化字符串.默认情况下不会初始化数组.

char username[25] = "";
char password[25] = "";
Run Code Online (Sandbox Code Playgroud)

对于它的价值,您可以使用sprintf更轻松地创建字符串:

sprintf(username, "USER %s\n", usr);
sprintf(password, "PASS %s\n", pswd);
Run Code Online (Sandbox Code Playgroud)

希望你也意识到使用固定大小的缓冲区是缓冲区溢出错误的一个配方.为了安全起见,您应该确保防范它们.这很烦人,但那对你来说是C:

if (snprintf(username, 25, "USER %s\n", usr)  >= 25 ||
    snprintf(password, 25, "PASS %s\n", pswd) >= 25)
{
    fprintf(stderr, "buffer overflow\n");
    exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)

  • @Marlon这不仅仅是优先权; strcpy和strcat会产生等待发生的缓冲区溢出安全漏洞.使用snprintf或更好的动态字符串库(或现代计算机语言). (2认同)