我正在尝试创建一个从文件名中提取扩展名的函数。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 != ' '; p++){
printf("extension: %c", *p);
}
return 0;
}
void get_extension(char *file_name, char *extension){
char *p;
for (p = file_name; *p != ' '; p++){
if(*p == '.'){
p++;
while(*p != ' '){
*extension = *p;
p++;
extension++;
}
} *extension = ' ';
}
}
我不断地得到一个分割错误,我不知道哪里出了问题。有人能帮我吗?谢谢
您的seg错误可能有两个原因。
1( ex
不指向任何内存。因此,在函数内部,您可以使用未初始化的指针写入内存位置。真糟糕。
2( 在函数中,内部while
循环一直持续到字符串结束。然后外循环递增p
并取消对它的引用。所以您读取的内容超出了字符串的末尾,这又是非常糟糕的。
试试看:
#include <stdio.h>
#define MAX_EXT_LEN 100
void get_extension(char *file_name, char *extension, int sz);
int main(){
char ex[MAX_EXT_LEN]; // Create an array to store the data
get_extension("hello.txt", ex, sizeof ex);
char *p;
printf("extension: ");
for(p = ex; *p != ' '; p++){
printf("%c", *p);
}
return 0;
}
void get_extension(char *file_name, char *extension, int sz){
char *p = file_name;
if (file_name == NULL || extension == NULL || sz < 1) return;
while (*p != ' ' && *p != '.') ++p;
if(*p == '.') ++p;
int cnt = 0;
while(*p != ' ' && cnt < (sz-1)){
extension[cnt] = *p;
++p;
++cnt;
}
extension[cnt] = ' ';
}
您应该更改此部分:
int main(){
char *ex;
转换为不仅声明指针,而且分配内存来存储结果的东西:
int main(){
char ex[100];
此外,我建议你看看strrchr()
,它可以帮助你更容易地找到扩展名:在C 中获得文件扩展名
我也想注意到这个代码:
char *p;
for(p = ex; *p != ' '; p++){
printf("extension: %c", *p);
}
不会像你想象的那样奏效。例如,对于"hello.txt"将打印:
extension: textension: xextension: t
不确定这是否是你想要的。