【问题标题】:Parsing an array of chars解析字符数组
【发布时间】:2010-12-02 12:28:10
【问题描述】:

假设我有“game.abc”作为字符串(字符数组),我想获取点之前的字符。您认为在 C 中执行此操作的最有效方法是什么?

“直到 . 将 char 复制到 char”是要走的路还是有其他方法?

我希望这个问题也可以帮助其他人。

谢谢!

【问题讨论】:

    标签: c arrays parsing char


    【解决方案1】:

    您还可以使用strchr() 后跟strncpy() 来查找“.”的第一个实例在你的字符串中,然后将它之前的所有字符复制到另一个字符串中

    【讨论】:

      【解决方案2】:

      这取决于您要优化的目标。如果为了可读性和易于理解/维护,那么 binW 的建议是正确的。

      如果您正在追逐循环并且只想访问输入的每个字符一次,那么最好按照您的建议并行执行这两个操作(搜索点和复制),方法是在同一个循环中执行它们.

      请注意,尽管后者有过早优化的味道。

      【讨论】:

        【解决方案3】:

        根据您要实现的确切目标,您自己逐个字符地解析字符串可能是处理速度方面最有效的。否则,标准字符串库函数可能是其他答案中建议的方法。

        从缓冲区到缓冲区的最有效复制是:

        char *in_ptr = in_string;
        char *out_ptr = out_buffer;
        
        while(*in_ptr != '.')
        {
            *out_ptr = *in_ptr;
            in_ptr++;
            out_ptr++;
        }
        *out_ptr = '\0';
        

        但是这有缓冲区溢出的风险。

        最有效的复制到分配的内存可能是:

        char *in_ptr = in_string;
        
        while(*in_ptr != '.') in_ptr++;
        
        out_string = (char *)malloc(in_ptr - in_string + 1);
        memcpy(out_string, in_string, (in_ptr - in_string));
        out_string[in_ptr - in_string] = '\0';
        

        我希望我的数学在那里是正确的。它应该是。根据编译器的不同,您可以通过将 (in_ptr - in_string) 分配给另一个变量来进行轻微优化,因此它只计算一次。第二个解决方案几乎与调用 strchr() 然后调用 memcpy() 相同。我推荐 memcpy,因为它省去了替换 '.' 的麻烦。使用空终止符,然后替换它,并将空终止符从一个字符串复制到另一个字符串。

        作为 unwind 的答案(在我写这篇文章时到达),所有这些可能都是不必要的优化。但很高兴知道。

        【讨论】:

          【解决方案4】:

          您可以使用 strtok() 来标记字符串。

          #include <stdio.h>
          main()
          {
          
          char str[]="games.abc";
          char *tmp,*tmp1;
          
          tmp = strtok(str,".");
          
          printf("tmp %s\n",tmp);
          
          tmp1 = strtok(NULL,"\0");
          printf("tmp1 %s\n",tmp1);
          

          }

          输出

          ./tmp1
          tmp games
          tmp1 abc
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-07
            • 1970-01-01
            • 2020-06-21
            • 1970-01-01
            • 2015-05-12
            • 2017-02-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多