C函数从文件地址到return文件名
C function to return file name from file address
我正在尝试编写一个函数,它将 return 从文件地址获取文件的文件名。它只是简单地复制地址的每个字符,从终止字符开始,直到第一个正斜杠 '\'
,到一个名为 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
被视为局部变量,并且作为数组,在 [=37= 之后得到 'deleted' ] 声明(我想知道一个正确的解释。我还是有点不明白那是什么。只有一个模糊的想法)。
现在,在将 main
函数添加到代码后,编译就可以了:
int main(int argc, char** argv){
char* name = file_name(argv[1]);
printf("File name is: %s", name);
return 0;
}
现在,出于某种原因,我没有得到任何输出。我给可执行文件一个带有有效文件地址的参数,但它没有给出任何输出。最重要的是,它只会停顿几秒钟,然后退出。这是怎么回事?我不认为这是算法的问题。该函数没有问题 returning 数组,因为它在更简单的情况下运行良好。为什么它不起作用?
我正在使用 GNU 编译器集合开发 Windows 10。
P.S。 - 我很想知道标准库中是否已经有一个函数从地址 returns 文件名。尽管如此,我仍然想知道为什么我的代码不起作用。
这是一个可能导致崩溃的非常明显的错误:
int i = -1;
for (; addr[i]
同样-1-i
也是错误的。这两个都是越界未定义行为的bug。
int len = -i;
也是错误的。在 C 编程中,您不能 有负数组索引。正式源码见C17 6.5.6/8
array, gets 'deleted' after the return statement(I would like to know a proper explanation
任何半正经的 C 书籍中都会提到这个非常常见的初学者错误。关于它的 SO 规范常见问题解答 post 是:Can a local variable's memory be accessed outside its scope?
The function has no problem returning arrays, as it works well in a simpler case.
如果一个函数只适用于某些测试用例,那是一个非常强烈的迹象表明该函数 根本无法正常工作 并且只是由于(坏)运气给出了正确的结果其他情况。参见 What is undefined behavior and how does it work?
我正在尝试编写一个函数,它将 return 从文件地址获取文件的文件名。它只是简单地复制地址的每个字符,从终止字符开始,直到第一个正斜杠 '\'
,到一个名为 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
被视为局部变量,并且作为数组,在 [=37= 之后得到 'deleted' ] 声明(我想知道一个正确的解释。我还是有点不明白那是什么。只有一个模糊的想法)。
现在,在将 main
函数添加到代码后,编译就可以了:
int main(int argc, char** argv){
char* name = file_name(argv[1]);
printf("File name is: %s", name);
return 0;
}
现在,出于某种原因,我没有得到任何输出。我给可执行文件一个带有有效文件地址的参数,但它没有给出任何输出。最重要的是,它只会停顿几秒钟,然后退出。这是怎么回事?我不认为这是算法的问题。该函数没有问题 returning 数组,因为它在更简单的情况下运行良好。为什么它不起作用?
我正在使用 GNU 编译器集合开发 Windows 10。
P.S。 - 我很想知道标准库中是否已经有一个函数从地址 returns 文件名。尽管如此,我仍然想知道为什么我的代码不起作用。
这是一个可能导致崩溃的非常明显的错误:
int i = -1;
for (; addr[i]
同样-1-i
也是错误的。这两个都是越界未定义行为的bug。
int len = -i;
也是错误的。在 C 编程中,您不能 有负数组索引。正式源码见C17 6.5.6/8
array, gets 'deleted' after the return statement(I would like to know a proper explanation
任何半正经的 C 书籍中都会提到这个非常常见的初学者错误。关于它的 SO 规范常见问题解答 post 是:Can a local variable's memory be accessed outside its scope?
The function has no problem returning arrays, as it works well in a simpler case.
如果一个函数只适用于某些测试用例,那是一个非常强烈的迹象表明该函数 根本无法正常工作 并且只是由于(坏)运气给出了正确的结果其他情况。参见 What is undefined behavior and how does it work?