Функция K & R Exercise Squeeze

Итак, упражнение здесь заключается в разработке программы, которая берет строку и удаляет все символы в этой строке, которые появляются во второй строке. Итак, со строками, которые я выбрал ниже, где первая строка - abc, а вторая строка - cde, я хочу получить результат ab, а не abc.

Я уже видел очень аккуратный способ выполнить эту функцию сжатия, которая требует только двух простых циклов, но мне было интересно, почему мой длинный изгиб не работает.

#include<stdio.h>

void squeeze(char s1[], char s2[]);
void copy(char to[], char from[]);

int k=0;

main()
{
    char array1[4]="abc";
    char array2[4]="cde";
    squeeze(array1, array2);
    printf("%s", array1);
}

void squeeze(char s1[], char s2[])
{
    int j,i,m;
    m=j=i=0;
    char s3[1000];
    while(s1[i]!='\0')   //What I'm doing here is taking a character in the string
    {                      //and comparing it with all characters in the second string.
        copy(s3,s1);       //If it exists in the second string I'm 'deleting' that letter
        while(s2[j]!='\0') //from the first string. Then I start all over again with the
        {                 // next letter in line. Or at least that the plan.
            if (s1[i]==s2[j])
            {
                k=1;
            }
            ++j;
        }

        if (k==1)
        {
            m=i;
            while(s3[m+1]!='\0')
            {
                s1[m]=s3[m+1];  //I'm 'deleting' the letter by pushing each character
                ++m;            //that is to the right of the deleted character to the  
            }                   //left of the array.
        }

        if(k!=1)
        {
            ++i;
        }
    }
    s1[i]='\0';
 }

void copy(char to[], char from[])
{
    int i;
    i=0;

    while(from[i]!='\0')
    {
        to[i]= from[i];
        ++i;
    }
    to[i]=='\0';
}

Ответ 1

внутри вашего внешнего устройства, пока вы должны reset "j" до нуля.

Если "k" bekomes 1, вы больше не увеличиваете "i". если вы запустите squeeze() во второй раз, вы не инициализируете "k" еще раз.

никогда не использовать глобальные переменные (или локальные переменные модуля), такие как "k" . Это делает ваш код небезопасным.

Ответ 2

высокая пятерка - я тоже читаю эту главу. Кажется, я читал его около 4 раз, так или иначе, мне действительно нужно учиться, я забыл весь контент в течение нескольких часов. Вот почему я почти закончил все упражнения в этой главе - глава 3 далее!

Здесь мое решение - функция сжатия несовместима с функцией getline (/0' вынуждает printf не печатать на std out.

Скомпилировать gcc 4.7.2 с помощью

gcc -Wall -std=c99 -pedantic squeeze.c

#include <stdio.h>
#define LIM 100

void squeeze(char[], char[]);
int ggetline(char[], int);

int main()
{
    //the getline function is buggy; it would produce null strings.
    char line1[LIM] = "hello";
    char line2[LIM] = "hello2";
    squeeze(line1, line2);
    printf("%s %s\n", line1, line2);

return 0;

}


/* getline: reads line into s, returns length */
int ggetline(char s[], int lim)
{
    int c, i;

    for (i = 0; i < lim-1 && (c = getchar()) != EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}

void squeeze(char s1[], char s2[])
{
    int j, l, i, k;

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

    }
}

Удачи!