如何从Char *的末尾删除Chars?

时间:2014-12-08 22:48:09

标签: c++ pointers char

我正在用C ++编写一个程序,它接受一个文件名的参数,参数是一个char *

ex:myFile.lan

我需要删除此char *(“lan”)的最后3位数字并将其更改为“asm”(例如:myFile.asm)
通过strcpy向char指针添加chars似乎很容易,但有人知道如何从char指针中删除chars吗?

4 个答案:

答案 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