gpt4 book ai didi

c - 段错误 strcpy

转载 作者:行者123 更新时间:2023-11-30 15:04:21 25 4
gpt4 key购买 nike

typedef struct Movie{
char hallName[50];
char movieName[50];
}movie;

我动态创建了电影数组。在 processCommand功能:

char *hallName;
hallName = strtok(NULL," ");

并调用createHall具有此参数的函数。

createHall(&halllName);

然后在 createHall函数我创建电影结构元素并在此处赋值。我要复制hallNameMovie.hallName 。我执行了 strcpy 但在 linux 中出现段错误。在 Windows 中,此代码可以正常工作。

strcpy(Movie.hallName, *hallName);

如何解决这个问题?

编辑:

int main(int argc, char *argv[])
{
FILE *inputFile = fopen(argv[1], "r+");
FILE *outputFile = fopen("output.txt","w+");
char *line=NULL;
movie *Movies = (movie*)malloc((hallNumber)*sizeof(movie));

while(1) {
line = readLine(inputFile);
if (line == NULL)
break;
processCommand(line,outputFile,Movies,hallNumber);
}
free(Movies);
closeFiles(inputFile,outputFile);
return 1;
}

void processCommand(char *line) {

char *hallName = NULL, *command = NULL;
command = strtok(line, " ");

if (strcmp(command, "CREATEHALL") == 0) {
hallName = strtok(NULL, " ");
createHall(&hallName);
}
...
}

void createHall(char **hallName) {
movie Movie;
strcpy(Movie.hallName, *hallName); // problem in here
...
}

最佳答案

您的代码中存在多个问题:

  • 您有语法错误:char *hallName = NULL, char *command = NULL; .

  • 您没有检查 strtok() 的返回值:可以是NULL以防不匹配。

  • 你传递了指针的地址hallName没有任何原因,只是传递值。

  • 您不检查潜在的溢出:如果hallName指向一个长字符串,strcpy()将导致缓冲区溢出。

  • 您定义movie作为 struct Movie 的 typedef还可以使用Movie作为 createHall() 中局部变量的名称。这很令人困惑。使用Movie对于struct标签和 typedef和小写 movie对于局部变量。

以下是解决这些问题的方法:

#include <stdio.h>
#include <string.h>

typedef struct Movie {
char hallName[50];
char movieName[50];
} Movie;

...

void createHall(char *hallName) {
Movie movie;
snprintf(movie.hallName, sizeof movie.hallName, "%s", hallName);
...
// do something with movie
}

void processCommand(char *line) {

char *hallName = NULL;
char *command = NULL;

command = strtok(line, " ");

if (command && strcmp(command, "CREATEHALL") == 0) {
hallName = strtok(NULL, " ");
if (hallName) {
createHall(hallName);
}
}
}

请注意processCommand修改了它接收指针的数组。这是一个糟糕的 API。您应该尽力避免此类副作用。 strtok()导致了这个副作用,并且它还有其他问题,因为它使用内部状态:避免使用此函数。

<小时/>

您最初提到strncpy在您的问题标题中,我将其删除,因为您实际上并未使用它。事实上,你永远不应该使用 strncpy() :它的语义经常被误解并且很容易出错。请参阅this article作者:布鲁斯·道森。

关于c - 段错误 strcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40328843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com