如何将argv []的内容复制到ac样式字符串中?

Sch*_*lar 3 c++ unix string segmentation-fault

我正在尝试编写一个程序,它在运行时接受几个参数来将文本附加到文件中.

该程序在运行时产生分段错误.这是代码:

int main(int argc, char* argv[])
{
    //error checking
    if (argc < 1 || argc > 4) {
        cout << "Usage: -c(optional - clear file contents) <Filename>, message to write"    << endl;
        exit(EXIT_FAILURE);
    }

    char* filename[64];
    char* message[256];

    //set variables to command arguments depending if -c option is specificed
    if (argc == 4) {
        strcpy(*filename, argv[2]);
        strcpy(*message, argv[3]);
    } else {
        strcpy(*filename, argv[1]);
        strcpy(*message, argv[2]);
    }

    int fd; //file descriptor 

    fd = open(*filename, O_RDWR | O_CREAT, 00000); //open file if it doesn't exist    then create one
    fchmod(fd, 00000);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我仍然是一个初学者,我在理解c字符串时遇到了很大的麻烦.char*和char []和char*[]之间有什么区别?

更新:

代码仍然会引发分段错误,这是我修改后的代码:

using std::cout;
using std::endl;

 int main(int argc, char* argv[])
 {

//error checking
if (argc < 1 || argc > 4) {
cout << "Usage: -c(optional - clear file contents) <Filename>, message to write"      << endl;
 exit(EXIT_FAILURE);
 }

char filename[64];
char message[256];

 //set variables to command arguments depending if -c option is specificed
 if (argc == 4)
{
strncpy(filename, argv[2], 64);
strncpy(message, argv[3], 256);
}
 else
 {
strncpy(filename, argv[1], 64);
strncpy(message, argv[2], 256);
 }

 int fd; //file descriptor 

 fd = open(filename, O_RDWR | O_CREAT, 00000); //open file if it doesn't exist then create one
 fchmod(fd, 00000);


 return 0;

 }
Run Code Online (Sandbox Code Playgroud)

Flo*_*ris 6

char* filename[64]创建一个包含64个指针的数组.您打算为64个字符的字符串创建空间 - 这将是char filename[64].因为您只为指针分配了空间,并且从未使指针指向任何内存,所以会出现seg错误.

解决方案:使用 char filename[64];

这会为您的字符串创建一个64字节的块; 该值filename指向此块的开头,可用于复制操作

strcpy(filename, argv[2]);
Run Code Online (Sandbox Code Playgroud)

我强烈建议使用"复制不超过n个字符"的功能 - 这可以防止一个非常长的参数导致缓冲区溢出.从而

strncpy(filename, argv[2], 64);
Run Code Online (Sandbox Code Playgroud)

会更安全.更好

strncpy(filename, argv[2], 63);
filename[63] = '\0';
Run Code Online (Sandbox Code Playgroud)

这可以保证复制的字符串以空值终止.

你有同样的问题message.我不认为你需要重复的代码......

如果您需要更多信息,请告诉我.

更新
今天我了解了存在strlcpy- 看到这个答案.NUL即使原始字符串长于分配的空间,它也会包含字符串终止符.请参阅此内容以获得更完整的讨论,包括所有编译器无法使用此功能的原因(如果您尝试编写可移植代码,这当然是一个主要缺点).