【问题标题】:opendir will not accept string variable but will accept plain stringopendir 不会接受字符串变量,但会接受纯字符串
【发布时间】:2015-07-02 13:29:22
【问题描述】:

我无法让这个函数工作,因为出于某种原因,opendir 不会正确地将 buffer2(声明为 char buffer2[128])作为参数。如果我用“。”之类的东西替换变量。或“样品”,它工作得很好。但是这样做,我每次都会遇到分段错误。请帮忙。

            system("clear");
            DIR *dirp;
            struct dirent *dp;
            printf("Enter directory name: ");
            fgets(buffer2, 100, stdin);
            if((dirp = opendir(buffer2)) == NULL)
                printf("Could not open directory\n");
            while((dp = readdir(dirp)) != NULL)
                printf("%s\n", dp->d_name);
            closedir(dirp);

            printf("Hit enter to return to selection.");
            getchar();

【问题讨论】:

  • 尝试将while循环和closeir放在if块中
  • fgets 读入的字符串在末尾保留换行符。阅读后尝试使用strtok(buffer2, "\n") 将其删除。您还应该检查fgets 的返回值。
  • 您是否尝试过strcpy(buffer2, ".") 或确认问题在于您使用的是缓冲区而不是缓冲区的内容?

标签: c linux directory systems-programming opendir


【解决方案1】:

char * fgets(char * str, int num, FILE * stream);

fgets() 从流中读取字符并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或到达文件结尾,以先发生者为准。

换行符使 fgets 停止读取,但它被函数视为有效字符并包含在复制到 str 的字符串中。

在复制到 str 的字符之后会自动附加一个终止空字符。

因此,您需要从文件名中删除 \n,然后将其传递给 opendir() 以进行进一步处理。


        system("clear");
        DIR *dirp;
        struct dirent *dp;
        printf("Enter directory name: ");
        fgets(buffer2, 100, stdin);

        // Lets remove tailing \n from buffer2
         strtok(buffer2, "\n");

        if((dirp = opendir(buffer2)) == NULL)
            printf("Could not open directory\n");
        else {
        while((dp = readdir(dirp)) != NULL)
            printf("%s\n", dp->d_name);
        closedir(dirp);
        }

        printf("Hit enter to return to selection.");
        getchar();

opendir 调用 get 失败时,您不需要使用 readdir ,所以将该部分放在 else 中

【讨论】:

  • 或者,可以使用scanf%s。这会在任何空白处停止,并且不会将其放入缓冲区。
  • @AlanAu Scanf 不会占用空间,并且空间可能存在于 dirname 和 scanf 中,您需要使用 fflush(stdin) 来清除多余的 \n 字符,以便更好地使用 fgets()
猜你喜欢
  • 2014-04-12
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多