我正在用C ++编写一个程序,它接受一个文件名的参数,参数是一个char *
ex:myFile.lan
我需要删除此char *(“lan”)的最后3位数字并将其更改为“asm”(例如:myFile.asm)
通过strcpy
向char指针添加chars似乎很容易,但有人知道如何从char指针中删除chars吗?
答案 0 :(得分:3)
如果您使用的是C ++,则应将参数转换为std :: string。这样可以保护您不受限制,更加清晰。
#include <string>
#include <iostream>
int main ()
{
// ... get the arg
const char* arg = "myFile.lan";
std::string filenameAsm(arg);
filenameAsm = filenameAsm.substr(0, filenameAsm.find_last_of("."));
filenameAsm += ".asm";
std::cout << filenameAsm; // prints myFile.asm
return 0;
}
此代码执行的操作仅采用“。”之前的文件名部分。文件扩展名分隔符(如果它不存在,它将采用整个文件名)并附加所需的“.asm”扩展名。
答案 1 :(得分:2)
使用char *
是基本的'C'。你可以在内存空间写任何东西,但要注意不要超过分配空间的末尾。
char *
个字符串都以空字节\0
终止。因此,要截断,您可以将\0
放在适当的位置。
另一方面,要覆盖字符,只需使用数组语法;例如如果字符串的长度为10,并且您想要更改最后一个字符,则c_string[9] = 'X';
会将该字符更改为X
。
答案 2 :(得分:1)
您必须知道字符串在C中的结束方式。字符串的长度由第一次出现的\0
字符决定。因此,通过向后移动此字符,您的字符串会变短。所以你可能想要在你的字符串中搜索点的第一个位置,然后用\0
替换这个点(这取决于字符串输入的确切程度。)我假设它是&#39;总是带有点的文件名,但你知道的更好。)
答案 3 :(得分:0)
使用string.h
中的工具可以简化任务。 strrchr
会在文件名中找到最后一个'.'
,允许您操作扩展名。不要忘记测试new/old
扩展名的长度以防止覆盖\0 - null-terminating character
(如果长度不同,您可以始终连接或重新分配字符串大小,但这超出了本示例的范围)。查看解决方案并告诉我您是否有任何问题:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char **argv) {
if (argc < 3) {
fprintf (stderr, "\n error: insufficient input. Usage: %s <filename> <new_ext>\n\n", argv[0]);
return 1;
}
char *filename = strdup (argv[1]); /* copy argv[1] to prevent clobbering it */
char *p = strrchr (filename, '.'); /* pointer to last '.' in filename */
char *ext = strdup (p+1); /* make a copy of existing extension */
size_t esz = strlen (ext); /* length of existing extension in filename */
size_t nesz = strlen (argv[2]); /* length of new extension */
if (esz < nesz) {
fprintf (stderr, "\n error: invalid extension size. (%s > %s)\n\n", argv[2], ext);
return 1;
}
printf ("\n The original filename: %s\n", filename);
strncpy (p+1, argv[2], nesz); /* copy new extension to filename */
if (nesz < esz) /* if new extension is shorter than old */
*(p+1+nesz) = 0; /* null terminate after new extesion size */
printf (" The amended filename : %s\n\n", filename);
if (filename) free (filename); /* free memory allocated by strdup */
if (ext) free (ext);
return 0;
}
<强>输出:强>
$ ./bin/swapext myfile.lan asm
The original filename: myfile.lan
The amended filename : myfile.asm
$ ./bin/swapext myfile.lan c
The original filename: myfile.lan
The amended filename : myfile.c