【发布时间】:2021-11-09 16:22:42
【问题描述】:
我正在尝试编写一个函数,该函数将从文件地址返回文件的文件名。它只是复制地址的每个字符,从终止字符开始,直到第一个正斜杠'\\',到一个名为name 的字符数组变量。然后,它只是颠倒变量name 中所有字符的顺序。我写了一个函数叫file_name(),像这样:
char* file_name(char* addr){
static char name[100];
char temp;
int i = -1;
for (; addr[i] != '\\'; --i){
name[-1-i] = addr[i]; // -1-i increases from 0 as i decreases. We get the reversed name of the file in "name"
}
int len = -i; //array length is simply -i. we know that through as i acts as the counter in the above iteration.
for (int count = 0; count < len; ++count){
temp = name[count];
name[count] = name[len - 1 - count];
name[len - 1 - count] = temp;
}
return name;
}
在收到编译器的警告并在 Google 上查找后,我已将 name 声明为静态变量。我发现没有使用static 关键字(或通过动态分配)声明它,name 被视为局部变量,并且作为一个数组,在返回语句后被“删除”(我想知道一个正确的解释。我还是有点不明白那是什么。只有一个模糊的想法)。
现在,在代码中添加 main 函数后,编译就很好了:
int main(int argc, char** argv){
char* name = file_name(argv[1]);
printf("File name is: %s", name);
return 0;
}
现在,由于某种原因,我没有得到任何输出。我给可执行文件一个带有有效文件地址的参数,但它没有输出。最重要的是,它只会停顿几秒钟,然后退出。这是怎么回事?我不认为这是算法的问题。该函数返回数组没有问题,因为它在更简单的情况下运行良好。为什么它不起作用?
我正在使用 GNU 编译器集合在 Windows 10 上工作。
附: - 如果标准库中已经有一个从地址返回文件名的函数,我将不胜感激。但是,仍然想知道为什么我的代码不起作用。
【问题讨论】:
-
仅供参考 `\` 是反斜杠,而不是正斜杠。
-
使用调试器 - DIY 解决方案。
-
我很确定
name[-1-i]和addr[i]总是会越界。您是否希望一个负索引环绕到数组的最后一个索引或其他什么? -
@mediocrevegetable1 @mediocrevegetable1
i从 -1 开始并减少(变得更负)所以-1-i从 0 开始并变得更正。 -
不应将名称定义为大小为 100 的静态字符,而应定义为输入文件名 +1 的 char* 和分配字符数。查看 strrchr 函数。从文件名的长度向后循环。循环停止应考虑 \ char 并且您仍在字符串中。