如何基于定界符将数组存储在三个不同的数组中

时间:2019-04-15 10:16:31

标签: c

我想基于/作为分隔符将输入数组分为三个不同的数组。

我尝试了一种(可能是幼稚的)方法,即使用getcharwhile将输入字符串存储到不同的数组中,以将字符读入数组并使用计数器来计数多少/出现的次数。

基于此数字,我将使用:

if (slashcounter == 0) {
      destinationarray[i++] = c;
}

将其存储到适当的数组中。下面是完整的实现。

请注意,我尝试仅使用stdio.h

#include <stdio.h>

char c; 
char replace[80], toBeReplaced[80], input[80], testInput[80];
int i = 0;
int slashcounter = 0;

int main(){

    puts("Enter a line of text: ");

    while (( c = getchar()) != '\n'){

        if (c == '/') {
            slashcounter++;
        }

        if (slashcounter == 0) {
            replace[i++] = c;
        }

        else if (slashcounter == 1) {
            toBeReplaced[i++] = c;
        }

        else if (slashcounter == 2) {
            input[i++] = c;
        }


    }
    //debug purpose
    puts("The arrays have the following content\n");
    puts("replace[]:\n");
    puts(replace);
    puts("\n");
    puts("toBeReplaced[]:\n");
    puts(toBeReplaced);
    puts("\n");
    puts("input[]:\n");
    puts(input);
    printf("Slashcounter = %d\n",slashcounter);



    return 0;

不幸的是,发生的事情是:第一个单词,即第一个斜杠之前的单词已正确存储,而另外两个为空。

我在这里做错了什么

输入为this/test/fails的当前输出

Enter a line of text: 
this/test/fails
The arrays have the following content

replace[]:

this


toBeReplaced[]:




input[]:


Slashcounter = 2
Program ended with exit code: 0

p.s。我还想确保/不在输出数组中。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您的代码中有两个直接问题,首先是您错过了为每个子字符串添加空字符的操作,其次,当您读取/

时,您从未将索引重置为0

其他问题是您不检查是否要写出数组,也不管理EOF

您还一直在测试 slashcounter 的值,这相当昂贵,您可以进行3次循环或使用指针指向要填充的数组等

也没有理由使用全局变量,它们都可以在 main

中是局部的

更改最少的示例:

#include <stdio.h>

int main(){
  int c;
  char replace[80], toBeReplaced[80], input[80];
  int i = 0;
  int slashcounter = 0;

  puts("Enter a line of text: ");

  while (( c = getchar()) != '\n') {
    if (c == EOF) {
      fprintf(stderr, "unexpected EOF");
      return -1;
    }

    if (c == '/') {
      if (slashcounter == 0) {
        replace[i] = 0;
      }
      else if (slashcounter == 1) {
        toBeReplaced[i] = 0;
      }
      else if (slashcounter == 2) {
        input[i] = c;
      }
      i = 0;
      slashcounter++;
    }
    else if (slashcounter == 0) {
      if (i != (sizeof(replace) - 2))
        replace[i++] = c;
    }
    else if (slashcounter == 1) {
      if (i != (sizeof(toBeReplaced) - 2))
        toBeReplaced[i++] = c;
    }
    else if (slashcounter == 2) {
      if (i != (sizeof(input) - 2))
        input[i++] = c;
    }
  }

  if (slashcounter == 0) {
    replace[i] = 0;
    toBeReplaced[0] = 0;
    input[0] = 0;
  }
  else if (slashcounter == 1) {
    toBeReplaced[i] = 0;
    input[0] = 0;
  }
  else if (slashcounter == 2) {
    input[i] = 0;
  }

  //debug purpose
  puts("The arrays have the following content\n");
  puts("replace[]:\n");
  puts(replace);
  puts("\n");
  puts("toBeReplaced[]:\n");
  puts(toBeReplaced);
  puts("\n");
  puts("input[]:\n");
  puts(input);
  printf("Slashcounter = %d\n",slashcounter);

  return 0;
}

请注意,我对 c 使用 int 处理 EOF ,并删除了无用的数组 testInput

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra s.c
pi@raspberrypi:/tmp $ ./a.out
Enter a line of text: 
this/test/fails
The arrays have the following content

replace[]:

this


toBeReplaced[]:

test


input[]:

fails
Slashcounter = 2