This question already has answers here:
Closed 6 years ago.
How do I complete K&R Exercise 2-4?
(5个答案)
所以这里的练习是设计一个程序,它接受一个字符串并删除该字符串中出现在第二个字符串中的所有字符。所以对于下面我选择的字符串,第一个字符串是abc,第二个字符串是cde,我希望得到ab的输出,而不是abc
我已经看到了一种非常简洁的方法来完成这个只需要两个简单for循环的挤压函数,但是我想知道为什么我冗长的方法不起作用。
#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's 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';
}

最佳答案

在你的外部,而你应该重置“j”为零。
如果“k”为1,则不再增加“i”。如果再次运行squeze(),则不会再次初始化“k”。
不要使用全局变量(或模块局部变量)如“k”。这会使代码线程不安全。

09-07 03:43