gpt4 book ai didi

c - 从 stdin c 读取文件名

转载 作者:太空宇宙 更新时间:2023-11-04 05:37:37 25 4
gpt4 key购买 nike

虽然这是一个非常基本的问题,应该很容易解决,但我一直没弄明白。我试图读入一个字符串,其中包含由标准输入中的空格分隔的文件名。虽然它似乎正确读取了所有文件名,但当我在文件名上使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com