我正在研究一个项目,我必须增加一个数组的大小或者它打印垃圾。
此变量在main
中声明char *fullPath[150];
然后我用一个问题向用户提问
printf("Enter full path where you want the file to be.\nExample: C:\\Windows\\System32\n");
scanf("%s", &fullPath);
然后我使用
检查此目录是否存在CheckDirectory(fullPath);
我的功能看起来像......
void CheckDirectory(char *d) {
DIR* dir = opendir(d);
char answer[2];
if (dir) {
printf("Directory Exists!\n");
closedir(dir);
} else if (ENOENT == errno) {
printf("Directory does not exist.\n");
printf("Do you want to create this directory? y/n:");
scanf("%s", &answer);
if (strcmp(answer, "y") == 0) {
printf("Ok creating directory\n");
MakeDirectory(d);
} else {
printf("ok not gonna make it");
exit(1);
}
} else {
printf("Some magical error.");
}
}
所以上面的代码基本上只是询问用户一个目录,然后将其放入fullPath [150]然后对其进行测试。我遇到错误的脚本的下一部分是..
CopyNewFile(fullPath, fileName, argv[0]);
该功能看起来像..
void CopyNewFile(char *dir, char *fname, char *curName) {
char fullDir[350];
char file[60];
strncat(file, curName, 20);
strncat(file, ".exe", 5);
strncat(fullDir, dir, 250);
strncat(fullDir, "\\", 5);
strncat(fullDir, fname, 30);
if (CopyFile(file, fullDir, FALSE)) {
printf("\n\nCopied new file.\n\n");
} else {
printf("Did not copy.");
};
}
现在,问题就出现了。当我尝试运行它时,它不会复制,除非
char fullDir[350];
超过300.我尝试了350并且它可以工作,但我还没有通过测试找到确切的数字,它不起作用。如果我是300,那么fullDir和文件会在它前面获取垃圾字符。
我认为它与分配内存的方式有关,但不是增加字符数组的大小我想修复它。
答案 0 :(得分:1)
char *fullPath[150];
声明了char *
的150个指针。你需要
char fullPath[150];
然后
scanf("%149s", fullPath);
或者您将错误的指针类型传递给scanf
。
(注意缺少&
和大小限制器以避免在进入路径时缓冲区溢出)
下一个错误(如评论中所示),(现在我意识到)可能是触发你得到的症状的错误:
char file[60];
strncat(file, curName, 20);
明白错误(fullDir
相同),因为file
未初始化。一个quickfix将是:
char file[60];
但正如Lundin在评论中提到的那样,最好完全避免使用strncat
。您可以将整个strncat
块替换为:
sprintf(file,"%55s.exe",curName);
sprintf(fullDir, "\\%347s", fname);
(试图计算最大字符数以避免溢出)
或使用第一个strcpy
然后strcat
的更经典的方法(尽管没有长度检查)
答案 1 :(得分:1)
在连接变量之前,你从未初始化变量file
。像这样改变它。与fullDir相同。
char file[60] = {0};
strncat(file, curName, 20);