c - 如何摆脱这种分段错误?
问题描述
我正在尝试创建一个从文件名中提取扩展名的函数。file_name 指向一个包含文件名的字符串。该函数应将文件名的扩展名存储在扩展名指向的字符串中。例如,如果文件名为“memo.txt”,该函数会将“txt”存储在扩展名指向的字符串中。如果文件名没有扩展名,该函数应该在扩展名指向的字符串中存储一个空字符串(单个空字符)。
这就是我所拥有的:
#include <stdio.h>
void get_extension(char *file_name, char *extension);
int main(){
char *ex;
get_extension("hello.txt", ex);
char *p;
for(p = ex; *p != '\0'; p++){
printf("extension: %c", *p);
}
return 0;
}
void get_extension(char *file_name, char *extension){
char *p;
for (p = file_name; *p != '\0'; p++){
if(*p == '.'){
p++;
while(*p != '\0'){
*extension = *p;
p++;
extension++;
}
} *extension = '\0';
}
}
我不断收到分段错误错误,我不知道出了什么问题。有人能帮助我吗?谢谢!
解决方案
你应该改变这部分:
int main(){
char *ex;
变成不仅声明一个指针,而且分配内存来存储结果的东西:
int main(){
char ex[100];
此外,我建议您看一下strrchr()
可以帮助您更轻松地找到扩展名:Getting file extension in C
另外我想注意到这段代码:
char *p;
for(p = ex; *p != '\0'; p++){
printf("extension: %c", *p);
}
不会像你想象的那样工作。例如“hello.txt”将打印:
extension: textension: xextension: t
不确定这是否是您想要的。
推荐阅读
- javascript - 使用 formik 进行反应选择:更改传递给选择的选项
- spring - 如何让 Spock 使用 @Transactional 运行?
- c# - 无法从 Web 应用程序连接到 HostGator(共享主机)SQL DB
- macos - 如何创建开发/测试环境以使用 azure 在 macOS(catalina/bigsur)上测试 Outlook javascript 添加?
- php - how to display ACF select field(drop down) in my website product add page?
- reactjs - Resizable column in material-table react
- swift - http域基地址中未连接的套接字
- android - 强制 Android Webview 使用 Chrome 或 Firefox
- c# - 使用多个显示器和不同 DPI 查找虚拟屏幕宽度
- html - CSS 不工作,我在做什么,我检查了所有部分并进行了硬刷新,但它不工作?