【问题标题】:Iterate through a character array while skipping over whitespace在跳过空格的同时遍历字符数组
【发布时间】:2015-04-06 06:00:58
【问题描述】:

我正在尝试编写一个程序,它遍历一个字符数组(其中包含一个句子),并将该句子中的单词分配给另一个数组,跳过空格(这是我们知道单独单词的方式),然后打印这些单词。

比如说我的字符数组是:

{'t','h','e',' ','f','o','x',' ','r','u','n','s','\0',}

我希望我的函数将单词分配给一个数组,将其命名为words,一次一个,跳过空格,然后逐个打印单词。

我试过了:

for (i = 0, x = 0; a[i] != '\0'; i++, x++){
    if (a[i] != ' '){
        words[x] = a[i];
    }
    else{
        words[x] = '\0';
            printf("%s\n", words);
            x=0;
            i++;
            continue;
        }
    }
    printf("%s\n", words);

但是当我运行它时,它只打印出s

【问题讨论】:

  • 您在哪里定义和设置 temp_var?因为 temp_var 是您正在打印的内容,并且未在您正在运行的代码中设置。
  • @Allaboutthatbase2 已修复,变量名不正确
  • 您有一个未使用的索引j。您正在使用索引x,但没有什么可以改变它。转码问题?
  • 我添加了一个工作示例。您需要为单词添加额外的下标,并使其成为一个多维数组。这是一种方法。或者您需要使用 malloc 和指针的更复杂的解决方案。

标签: c arrays string character


【解决方案1】:

我的建议是strtok()。这会很容易。

想法:

  1. 使用strtok() 和空格' ' 作为分隔符来找出每个出现的单词
  2. 使用strcpy() 复制将返回的tokens(单词)复制到word 数组中。

注意:

我希望我的函数将单词分配给一个数组,将其称为单词,一次一个,跳过空格,然后逐个打印单词。

您当前的代码看起来不一样。

  1. 您可以摆脱对输入字符串进行迭代的for 循环。
  2. 您需要在同一输入上继续 strtok(),直到它返回 NULL
  3. words[x] 需要是 char *(具有正确分配的内存)或 char [](数组)来保存从输入字符串中找到的每个 word,然后逐个打印。

【讨论】:

    【解决方案2】:

    请注意,main 之外定义的变量(数组a 除外,它被显式设置为字符串)默认情况下由编译器清零,不需要显式初始化,但您必须非常在一般情况下,尤其是在函数中初始化时要小心。

    a,虽然定义为指向字符串文字的指针,但也可以作为字符数组访问。

    输出:

    words[0] = the
    words[1] = fox
    words[2] = runs
    

    这行得通:

    #include <stdio.h>
    
    #define MAX_WORDS 1000
    #define MAX_WORD_LEN 32
    char *a = "the fox runs";
    char words[MAX_WORDS][MAX_WORD_LEN];
    int i, j, k;
    
    int
    main(void) 
    {
        for (i = 0; k < MAX_WORDS && a[i] != '\0'; i++) {
            if (a[i] != ' ' && j <= 32) {
                words[k][j++] = a[i];
            } else {
                words[k++][j] = '\0';
                printf("words[%d] = %s\n", k - 1, words[k - 1]);
                j = 0;
            }
        }
        printf("words[%d] = %s\n", k, words[k]);
    }
    

    【讨论】:

      【解决方案3】:

      使用 continue in for 循环,您不需要 i++,您需要设置 x=-1

      for (i = 0, j = 0; a[i] != '\0'; i++, x++){
          if (a[i] != ' '){
              words[x] = a[i]; // U need to use j
          }
          else{
              words[x] = '\0';
                   printf("%s\n", words);
                  x=-1; // as you are using continue
                  // i++; You don't need this
                  continue;
              }
          }
           printf("%s\n", words);
      

      【讨论】:

        【解决方案4】:

        这是完整的程序吗?

        words[x] = a[i];
        

        您可能希望在每次找不到空格时将words[x] 放入循环中,将x 递增1

        好的,我注意到您已对其进行了编辑。另外,它是一个数组,所以我想你需要遍历数组并打印每个字符。

        用于打印,

        for (j = 0; j < sizeof(words)/sizeof(words[0]); j++ )
            {
                printf("%c", words[j] );
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-31
          • 1970-01-01
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-25
          • 2013-10-14
          相关资源
          最近更新 更多