【发布时间】:2015-12-17 14:14:45
【问题描述】:
我正在使用 C 语言,我必须连接一些东西。
现在我有这个:
int main(int argc, char *argv[])
{
char tftp_cmd[TFTP_MAX_BUFFER_SIZE];
char ip_server[IP_MAX_LEN];
char file_name[FILE_MAX_LEN];
const char * tftp_get = "tftp -g -r ";
strcpy(&ip_server[0], argv[1]);
strcpy(&file_name[0], argv[2]);
tftp_cmd[0] = '\0';
strcpy(tftp_cmd, tftp_get);
printf("tftp get command = %s\n", tftp_cmd);
strncat(tftp_cmd, file_name, sizeof(tftp_get) + sizeof(file_name));
printf("tftp get command = %s\n", tftp_cmd);
strncat(tftp_cmd, ip_server, sizeof(tftp_get) + sizeof(file_name) + 1);
printf("tftp get command = %s\n", tftp_cmd);
return 0
}
此应用返回:
# ./test_app 10.0.0.1 MY_TEST_FILE_17.12.2015
tftp get command = tftp -g -r
tftp get command = tftp -g -r MY_TEST_FILE_17.12.2015
tftp get command = tftp -g -r MY_TEST_FILE_17.12.201510.0.0.1
我想要tftp -g -r MY_TEST_FILE_17.12.2015 10.0.0.1
我正在使用好方法吗?
【问题讨论】:
-
只需使用
sprintf... -
像
&ip_server[0]这样的东西在这里混淆了你的意图。当您要使用数组时,最好使用数组的名称:ip_server。虽然在技术上是相同的,但它不仅使您的意图更清楚地使用第一个条目(并且更少输入和阅读).. -
对于这种行:
strcpy(&ip_server[0], argv[1]);,在没有首先检查argc以确保命令行参数是由用户实际输入的情况下,永远不要访问 argv[] 中除argv[0]之外的任何条目。当参数数量不正确时,输出'usage'语句以显示使用正确命令行的格式/语法
标签: c string parameters concatenation