【问题标题】:Using strtok only works if I put the delimiter after the last item仅当我将分隔符放在最后一项之后才使用 strtok
【发布时间】:2020-01-20 05:50:32
【问题描述】:

所以我试图打开和读取基于 stdinput 的文件。我使用 strtok 来解​​析输入,以便用户可以输入多个文件。我已将分隔符设置为空格。

int main(const int argc, const char *argv[]){
    if (argc == 1) {
        char str[100];
        const char delim[2] = " ";
        printf("Enter a filename:\n");

        fgets(str, 100, stdin);
        char *ptr = strtok(str, delim);
        while (ptr != NULL){
            FILE *fp = fopen(ptr, "r");
            if ((fp == NULL)) {
                fprintf(stderr, "failed to open %s\n", ptr);
            }
            else{
                printf("Opening file: %s\n", ptr);
                char c;
                while ((c = fgetc(fp)) != EOF){

                    if (c != ' '){
                        putchar(c);
                    }
                    if (c == ' ') {
                        printf("\n");
                    }

                }
                fclose(fp);
            }
            ptr = strtok(NULL, delim);
        }
        return 0;
    }

如果我输入“example.txt example2.txt”,它会读取example.txt,然后说打开example2.txt失败。但是,如果我输入“example.txt example2.txt”(注意多余的空格),它会正确读取它们,但最后会显示“打开失败”而没有文件名。此外,单独读取一个文件会导致“无法打开”。有什么想法吗?

【问题讨论】:

  • delim[2] = " "; -> delim[] = " \r\n";
  • 如果您不使用argcargv,建议使用int main(void)。此外,fgetc() 返回一个 int,而不是 char — 您可能会过早检测到 EOF(如果普通 char 类型已签名)或根本检测不到它(如果普通 char 类型未签名) .使用int c; 并避免问题。

标签: c strtok


【解决方案1】:

fgets() 在字符串中包含换行符。由于您没有在分隔符字符串中添加换行符,因此第二个文件名将返回为 "example2.txt\n",并且该文件名不存在。

更改分隔符以包含换行符:

const char delim[] = " \n";

【讨论】:

    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2012-08-01
    • 2018-02-23
    • 2015-07-17
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多