c - 从 stdin c 读取文件名

标签 c stdin fgets strtok stat

虽然这是一个非常基本的问题,应该很容易解决,但我一直没弄明白。我试图读入一个字符串,其中包含由标准输入中的空格分隔的文件名。虽然它似乎正确读取了所有文件名,但当我在文件名上使用 stat() 时,它总是在最后一个文件上失败。所有文件都存在,但最后一个文件总是失败,例如,如果标准输入是“file.txt thisFile.txt thisFile.txt”,如果我要求它将输入打印到标准输出,它将打印“file.txt thisFile.txt”。 txt thisFile.txt”,但是当我在文件上使用 stat() 时,它适用于除最后一个文件之外的所有文件。我相信这与我阅读文件的方式有关,我们将不胜感激。附言如果我以空格“file.txt thisFile.txt thisFile.txt”结束输出,它将毫无问题地统计所有文件。但是,由于程序的其他部分和需要通过管道处理的其他文件,额外的空格不是有效的输入格式。

char *input = 0;
char buffer[10];
size_t curMax = 0;
size_t curLen = 0;
fprintf(stderr, "accessed waiting for input\n");
while(fgets(buffer,sizeof(buffer),stdin)!=0)
{
    size_t bufLen = strlen(buffer);
    if(curLen+bufLen+1>curMax)
    {
        size_t newLen = curMax*2+1;
        if(bufLen+1>newLen)
            newLen=bufLen+1;
        char *extra = realloc(input, newLen);
        if (!extra)
            break;
        input = extra;
        curMax = newLen;
    }
    strcpy(input+curLen,buffer);
    curLen+=bufLen;
}

fprintf(stderr, "accessed input received: %s\n", input);
int i = 0;
int count = 1;
for (i = 0; i < strlen(input); i++){
    if (input[i] == ' ')
        count++;
}
char * fileNames[count];
char * pch = strtok(input, " \0FEOFfeof\n");
int j = 0;
for (j = 0; pch != NULL; j++){ //Read file names
    fileNames[j] = (char *)malloc(strlen(pch));
    strncpy(fileNames[j],pch, strlen(pch));
    pch = strtok(NULL, " \0FEOFfeof\n");
}

最佳答案

接受答案后

"\0FEOFfeof\n" 中的 "\0"(八进制转义序列)导致截断模式

char * pch = strtok(input, " \0FEOFfeof\n");
// same as 
char * pch = strtok(input, " ");

推荐一些变体

char * pch = strtok(input, " \n\r\t\v\f");

关于c - 从 stdin c 读取文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28909874/

相关文章:

c - 如何从\n 分隔文件中读取字符串

涉及管道的c并行进程

编译错误 - 数值常量

c - 生成前 50 个可被 7 整除的正整数

c - 字符串正在打印奇怪的字符 - lex 中的 c 代码

C:程序跳过下一个输入

C程序跳行

Python 线程标准输入/标准输出

Python 从命令行参数或标准输入中读取

c - 从 C 中的 stdin 读取某些内容后,如何再次从 stdin 读取一行?