【问题标题】:Searching a char array for a position in the array in C在 char 数组中搜索 C 中数组中的位置
【发布时间】:2014-09-16 04:32:19
【问题描述】:

不确定是否有人问过这个问题,我真的不知道该怎么问:我将发布我拥有的代码,我知道我离得很远,但我想表明这一点我尝试过,但失败了。

我将发布代码然后解释它,然后提供更多信息:

while(i<41)
{
    if (buffer[i] != 0)
    {
    newplace = i;
    }
    i++;

}

buffer 是一个长度为 42 的 char 数组。最后一个位置是一个空占位符。

缓冲区将从 END 开始接收值。我以相反的顺序进行。问题是当我打印它时,它会用 0 填充第一个位置,这很烦人。我的目标是找到第一个不是 0 的位置,并将其保存到变量(newplace)作为占位符。保存后,我可以使用从这个新占位符开始的循环打印数组。这听起来很基本,我可能非常接近(或大错特错)。

我觉得一旦我找到了我需要在那里休息的价值,因为它会继续寻找下一个价值并改变它。每次我尝试这个都会给我一个错误。

我也知道最后的 i++ 看起来很愚蠢。别担心我知道。我只是放弃了尝试修复它。

最后,如果我错过了什么,请告诉我。我将编辑或添加代码。谢谢。

编辑:这是它的打印内容:000000000000000012345。我希望它打印 12345。

编辑:现在输出到数组的末尾,因为 i 最多计数 40。它进入我的第二个打印循环并打印 newplace,因为它打印出 40,然后打印从 40 到 41 的数组。与最后一位一样。

编辑:我觉得我越来越近了。我对其进行了修改,因此它比较了 2 个字符数组而不是数组和字符。

for(;i<41;i++)
    {
        if (buffer[i] != "0123456789ABCDEF"[0])
        {
        newplace = i;

        //break;
        }

    }

"0123456789ABCDEF"[0] 是我所做的全部更改。它打印的是不是 0 的最后一个已知值:这意味着:如果有 1010,它会查看 LAST 1 并打印 10。我希望它找到 FIRST 1。

我也尝试了 100,它打印了 100。但如果它是 10100,它将打印 100,我希望它打印 10100。

【问题讨论】:

  • 为什么不在while循环中打印而不是保存到另一个变量?
  • 因为我想找到一个起点。即:000000123 vs 123。这就是我想要的。
  • 但是如果你在if里面打印你会得到123...
  • Every time I try this it gives me an error. 为什么人们认为可以这样说却不告诉我们错误是什么? - 你甚至没有描述它在什么方面不起作用!
  • 但这是正确的说法吗?

标签: c arrays search


【解决方案1】:
int i = 0;
int start = -1;
while(buffer[i] != 0) { // Assumes 0 terminated array
    if (buffer[i] == '0') {
        start = i;
        break;
    }
    i++;
}
if (start >= 0) {
    // start is valid, so do output...
}

【讨论】:

    【解决方案2】:

    不是一个真正的答案:但我以不同的方式解决了它。

    在我的主要论点中改变一个东西,说不要把这些值放进去,所以它们是空的,然后整个事情就是浪费时间。

    我有

    while(place>0)
    

    改成

    while(place>0 && value != '\0')
    

    真的断章取义,因为我没有给出我所有的代码。

    GG WP。谢谢大家的帮助!!!

    【讨论】:

      【解决方案3】:

      有多种方法可以在包含附加字符的字符串中的所需点开始打印。您可以从开头开始并逐步降低字符串,直到找到所需的字符,或者您可以从结尾开始并向后工作。在任何一种情况下,您都使用一个指针设置为您想要开始搜索所需字符的位置,然后检查字符串中的每个字符,递增或递减指针,直到找到所需的字符。前进方向是直线前进:

      #include <stdio.h>
      
      int main (void) {
      
          char buffer[] = "00000000000000000012345";  /* zero pad buffer and string         */
          char *sp = NULL;                            /* pointer to wamted part of buffer   */
      
          sp = buffer;                                /* set pointer to beginning of buffer */
      
          while (sp++) {                              /* for each character in buffer       */
              if (*sp != '0') {                       /* if pointer != '0'                  */
                  break;                              /* break, sp points to wanted string  */
              }
          }
      
          /* print original buffer and wanted end string
          (pointed to by sp) */
          printf ("\n                    buffer  : %s\n", buffer);
          printf ("  sp (wanted end of buffer) : %s\n\n", sp);
      
          return 0;
      }
      

      构建:

      gcc -Wall -Wextra -o bin/fbuf fwdbuffer.c
      

      运行/输出:

      $ ./bin/fwdbuf
      
                          buffer  : 00000000000000000012345
        sp (wanted end of buffer) : 12345
      

      为什么要逆向工作?在许多情况下,例如使用calloc 分配内存或使用memset 将字符串设置为null 时,不可能正向工作。在这种情况下,向后工作是关键:

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      
      int main (void) {
      
          char buffer[] = "00000000000000000012345";  /* zero pad buffer and string        */
          char *sp = NULL;                            /* pointer to filled part of buffer  */
          size_t i = strlen (buffer);                 /* len of buffer (not incl. null  )  */
      
          sp = buffer + i - 1;                        /* set pointer at buffer null-term   */
      
          while (sp-- && i--) {                       /* backup in buffer until '0'        */
              if (*sp == '0') {                       /* if pointer == '0'                 */
                  sp++;                               /* increment by 1 to last good char  */
                  break;                              /* break, sp points to wanted string */
              }
          }
      
          /* print original buffer and wanted end string
          (pointed to by sp) */
          printf ("\n                    buffer  : %s\n", buffer);
          printf ("  sp (wanted end of buffer) : %s\n\n", sp);
      
          return 0;
      }
      

      构建:

      gcc -Wall -Wextra -o bin/rbuf revbuffer.c
      

      运行/输出:

      $ ./bin/rbuf
      
                          buffer  : 00000000000000000012345
        sp (wanted end of buffer) : 12345
      

      如果您有任何问题,请不要犹豫。

      【讨论】:

        猜你喜欢
        • 2018-12-15
        • 2016-03-17
        • 2013-12-26
        • 2022-01-21
        • 2014-03-26
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        相关资源
        最近更新 更多