字符数组打印垃圾,除非我增加数组大小

时间:2018-01-19 14:58:08

标签: c

我正在研究一个项目,我必须增加一个数组的大小或者它打印垃圾。

此变量在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和文件会在它前面获取垃圾字符。

我认为它与分配内存的方式有关,但不是增加字符数组的大小我想修复它。

2 个答案:

答案 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);