从C中的字符串中删除.txt

时间:2016-03-26 01:34:59

标签: c

我想显示没有.txt扩展名的文件名。我已经从dir-> d_name。

中存储了文件+扩展名

在我的脑海中以下列方式做到这一点是有道理的:

char filename[size]; //assume this already contains name followed by.txt
filename[size-4] = '\0';

我试过这个,但我仍然得到它的扩展名。也许我并不完全理解null终止符的工作原理。

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

此:

filename[size-4] = '\0';

不起作用,因为大小不一定是(必然)字符串的长度。

尝试:

filename[strlen(filename) - 4] = '\0';

最小例子:

#include <stdio.h>
#include <string.h>

#define SIZE 20

int main(void) {
  char filename[SIZE] = "test.txt";
  printf("%s\n", filename);
  // -4 for .txt
  filename[strlen(filename) - 4] = '\0';
  printf("%s\n", filename);
  return 0;
}

输出:

gsamaras@gsamaras:~$ ./a.out 
test.txt
test

PS - 您可能想检查 .txt 是否真的存在。

* ,使用strstr(),您可以执行此操作并检查 .txt 是否确实存在:

#include <stdio.h>
#include <string.h>

int main (void) {
  char str[] = "test.txt";
  char *pch;
  pch = strstr(str, ".txt");
  if(pch) // if's body won't execute if .txt is absent
    *pch = '\0';
  puts(str);
  return 0;
}

* as @ user3386109说

答案 1 :(得分:0)

尝试做

strncopy(noExt_string, filename, strlen(filename) - 4)

这应该将filename的内容复制到noExt_string而不包含最后4个字符。

答案 2 :(得分:0)

如果您只想打印没有.txt扩展名的文件名,那么您可以在不更改字符串的情况下执行此操作。

write(1, filename, strlen(filename) - 4);