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

时间:2011-02-08 23:32:23

标签: 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);

}

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

C->S: USER anonymous
S->C: 331 Please specify the password.
C->S: (??_?PASS random

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

4 个答案:

答案 0 :(得分:12)

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

char username[25] = "";
char password[25] = "";

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

sprintf(username, "USER %s\n", usr);
sprintf(password, "PASS %s\n", pswd);

希望你也意识到使用固定大小的缓冲区是缓冲区溢出错误的一个方法。为了安全起见,您应该确保防范它们。这很烦人,但那对你来说是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);
}

答案 1 :(得分:1)

一些有用的规则。

  • 请记住初始化并终止字符串。
  • 使用库函数。
  • 使用外部数据时检查字符串长度和/或使用n(大小限制)函数。
  • 调整缓冲区时不要忘记终止符。

答案 2 :(得分:0)

你不应该strcat一个未初始化的数组。 尝试:

char *password[25] = "";
password = strcat(PASS);

为第一个。

此外,您应使用strcat()代替strncat()以避免溢出。


我认为这样做更容易:

int len = snprintf(password, 25, "%s %s\n", PASS, pswd);
if (len > 25) {
    // oops! password is too long dude :-(
}

See here for some examples

答案 3 :(得分:-1)

尝试将“\ n \ 0”而不仅仅是“\ n”添加到用户名和密码数组中。