strcat正常工作

时间:2015-07-19 05:18:18

标签: c strcat

我正在尝试传递命令行参数,然后我将其适当地连接以生成shell命令,以便我可以使用system()运行它们(我知道它不可取,并且有更好的方法,但我被要求这样做只有这样)。但是在我传递的字符串的连接中存在一些问题 这是代码(我已经在每一步都打印了所有内容以便清楚地理解并且我还没有编写系统()调用,首先我需要对此连接进行排序):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
     char* path=argv[1];
     char* oldName=argv[2];
     char* newName=argv[3];
     char* command1="cd "; 
     char* command2="ren ";
      printf("\n\n%s\n%s\n%s\n%s\n%s\n",command1,command2,path,oldName,newName);
    strcat(command1,path);
    printf("\n\n%s\n%s\n%s\n%s\n%s\n",command1,command2,path,oldName,newName);
    strcat(oldName," ");
    strcat(oldname,newName);
    printf("\n\n%s\n%s\n%s\n%s\n%s\n",command1,command2,path,oldName,newName);
    strcat(command2,oldName);
    printf("\n\n%s\n%s\n%s\n%s\n%s\n",command1,command2,path,oldName,newName);

    return 0;
}

然而,在将command1连接到路径后,一切都搞砸了。

http://i.stack.imgur.com/vPxxD.png

3 个答案:

答案 0 :(得分:1)

strcat通过将源字符串中的字节复制到目标字符串的末尾来工作。问题是您的目标字符串是:

  1. 常量字符串(可能不在可写内存中)
  2. 不足以保存整个结果
  3. 您应该创建一个像char buffer[1024]这样的字符缓冲区来保存命令并使用snprintf将命令格式化为缓冲区。

答案 1 :(得分:1)

strcat期望目的地足够大以容纳结果。致quote

  

指向目标数组的指针,该数组应包含一个C字符串,并且足够大以包含连接的结果字符串。

答案 2 :(得分:-1)

您需要使用字符缓冲区分配空间以防止strcat崩溃,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
    char* path=argv[1];
    char oldName[256];
    char* newName=argv[3];
    char command1[256];
    char command2[256];
    strcpy(command1, "cd ");
    strcpy(command2, "ren ");
    strcpy(oldName, argv[2]);
    printf("\n\n%s\n%s\n%s\n%s\n%s\n",command1,command2,path,oldName,newName);
    strcat(command1,path);
    printf("\n\n%s\n%s\n%s\n%s\n%s\n",command1,command2,path,oldName,newName);
    strcat(oldName," ");
    strcat(oldName,newName);
    printf("\n\n%s\n%s\n%s\n%s\n%s\n",command1,command2,path,oldName,newName);
    strcat(command2,oldName);
    printf("\n\n%s\n%s\n%s\n%s\n%s\n",command1,command2,path,oldName,newName);

    return 0;
}