更改路径文件名在某些计算机上会产生不正确的结果。 C++

问题描述 投票:0回答:1

我正在获取一个文件路径,然后尝试用另一个文件名替换该文件名。我的代码在一台计算机上可以正常运行,但在另一台计算机上则不能。

这是我的代码:

FILE* SETTINGS_FILE;
char value[255];
char error[255];
char directory[255];
char file[255];
char* pos;
A_char pluginFolderPath[AEFX_MAX_PATH];


// READ LICENSE FILE IF AVAILABLE
PF_GET_PLATFORM_DATA(PF_PlatData_EXE_FILE_PATH_DEPRECATED, &pluginFolderPath);
strcat(pluginFolderPath, "\n");
pos = strrchr(pluginFolderPath, 0x5C);
if (pos != NULL) strcpy(file, pos + 1); 
strcpy(directory, "");
strncpy(directory, pluginFolderPath, strlen(pluginFolderPath) - strlen(file));  // strip file extension and counter
strcat(directory, "dofpro_ae.lic");

在不正确的计算机上,显示如下:

Garbled Path

您可以看到它在文件名的开头添加了一个方形字符,就在“d”之前。

有什么想法为什么会发生这种情况,以及为什么它可以在一台计算机上运行,但不能在另一台计算机上运行?

然后我尝试加载文件,但当然,由于添加了乱码,它找不到它。

此外,有没有更简单/更干净的方法来做到这一点?

谢谢

c++ string char filenames
1个回答
0
投票

strncpy 不保证空终止。引用上面链接的参考文献

If count is reached before the entire array src was copied, the resulting character
array is not null-terminated.

另一方面,下一行代码使用

strcat
,这取决于它的参数是否以 null 结尾。这就是你的代码有问题的地方。

您可以做的最小更改是确保在开始字符串操作之前整个

directory
数组都填充有空字节

char directory[255]{};

这意味着

strncpy
可能不会(在您的情况下)添加空字节不是问题,因为您已经用空字节填充了数组。

© www.soinside.com 2019 - 2024. All rights reserved.