読者です 読者をやめる 読者になる 読者になる

プログラミング言語 C 2.4

c k&r


文字列 s2の中の任意の文字に等しい文字を s1から除去するような
squeeze(s1, s2)を書きなさい、という問題。しかし Cだと特にテストを
書いてみるって重要な気がしてきた。なんとなくうまくいくときもある
言語なのでそこはしっかりとしないとね。

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>

static void squeeze(char *s1, char *s2);
static void test_squeeze(void);

int
main (int argc, char **argv)
{
     if (argc != 3) {
          fprintf(stderr, "Invalid Argument Number\n");
          exit(EXIT_FAILURE);
     }

     test_squeeze();
     squeeze(argv[1], argv[2]);

     printf("answer = %s\n", argv[1]);

     return 0;
}

static void
test_squeeze()
{
     char s1[100] = "";
     char *s2 = "";

     squeeze(s1, s2);
     assert(!strcmp(s1, ""));

     strcpy(s1, "a");
     squeeze(s1, "b");
     assert(!strcmp(s1, "a"));

     squeeze(s1, "a");
     assert(!strcmp(s1, ""));

     strcpy(s1, "abcde");
     squeeze(s1, "ace");
     assert(!strcmp(s1, "bd"));
}


static void
squeeze(char *s1, char *s2)
{
     int i, j, k;

     for (i = 0, j = 0; s1[i] != '\0'; i++) {

          for (k = 0; s1[i] != s2[k] && s2[k] != '\0'; k++) {
               /* EMPTY */
          }

          if (k == strlen(s2)) {
               s1[j++] = s1[i];
          }
     }
     s1[j] = '\0';
}