【问题标题】:How do I remove Chars from the end of a Char*?如何从 Char* 末尾删除字符?
【发布时间】:2014-12-08 22:48:09
【问题描述】:

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

例如:myFile.lan

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

【问题讨论】:

  • 您可以使用strcpy 覆盖它们。不过要小心,因为如果您要覆盖的数字至少为 3 位,这将不起作用。如果您无法使其工作,请发布您尝试过的代码。
  • I know these seems super simple 专业程序员的许多错误源于使用原始 C 字符串和char * 做这些“超级简单”的事情。这就是为什么 C++ 有 std::string...
  • 使用 strstr() 查找搜索字符串的开头(I 将搜索 '.',然后前进一个字符以查找结尾字符串。(我们可以假设'.'之后总是有3个字符?然后通过将'.'之后的第一个字符设置为'\0'来替换尾随字符。然后使用strcat(原始字符串,“asm”)
  • 顺便说一句,您使用的是什么操作系统?如果是 Windows,则不必自己执行此操作,因为有很多 Windows API 函数可以拆分文件路径字符串。如果是这样,让操作系统为您拆分字符串,而不是您必须搜索一个点,做其他事情,并且可能会出错或遇到“边缘情况”。例如,扩展名不必是 3 个字符。

标签: c++ pointers char


【解决方案1】:

如果您使用 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”扩展名。

【讨论】:

  • 如果你使用 c++ 总是 使用 std::string
【解决方案2】:

使用char * 是基本的“C”。您可以将任何内容写入内存空间,但请注意不要超过分配空间的末尾。

char * 字符串都以空字节\0 结束。因此,要截断,您可以在适当的位置放置 \0

另一方面,要覆盖字符,只需使用数组语法;例如如果字符串长度为 10 并且您想更改最后一个字符,c_string[9] = 'X'; 会将那个字符更改为 X

【讨论】:

    【解决方案3】:

    您必须知道字符串在 C 中是如何结束的。字符串的长度由\0 字符的第一次出现决定。因此,通过向后移动这个字符,你的字符串会变短。所以你可能想在你的字符串中搜索点的第一个位置,然后用 \0 替换这个点(这取决于字符串输入的确切情况。我假设它总是在某处带有点的文件名,但你知道得更好)。

    【讨论】:

      【解决方案4】:

      使用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
      

      【讨论】:

        猜你喜欢
        • 2010-11-05
        • 2011-02-20
        • 2011-07-14
        • 2017-01-06
        • 2023-04-07
        • 1970-01-01
        相关资源
        最近更新 更多