0

所以我正在尝试在 K&R 中进行练习。它想让我做一个类似于挤压的功能,我不明白它有什么问题。我已经在办公桌上检查过了。我不想在网上找到解决方案,我想了解为什么我的代码不起作用。

//removes characters that are present in both strings
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAXLTR 15

void removesame(char s1[],char s2[]);

int main(void)
{
    char string1[MAXLTR],string2[MAXLTR];
    printf("Enter a string: ");
    scanf("\n%s",&string1);
    printf("\nEnter the letters/words to be removed: ");
    scanf("\n%s",&string2);
    removesame(string1,string2);
    printf("\nFinal output: %s",string1);
    getch();
}

void removesame(char s1[],char s2[])
{
    char temp[MAXLTR];
    int arraycntr,comparecntr;
    for(comparecntr = 0; comparecntr < MAXLTR; comparecntr++)
    {
        for(arraycntr = 0;arraycntr < MAXLTR;arraycntr++)
        {
            if(s1[arraycntr] == s2[arraycntr])
                s1[arraycntr] == '\t';
        }
    }
    comparecntr = 0;
    for(arraycntr = 0; arraycntr < MAXLTR; arraycntr++)
    {
        if(s1[arraycntr] != '\t')
        {
            temp[comparecntr] = s1[arraycntr];
            ++comparecntr;
        }
    }        
    for(arraycntr = 0; arraycntr < MAXLTR; arraycntr++)
        s1[arraycntr] = '\0';
    for(arraycntr = 0;arraycntr < MAXLTR; arraycntr++)
        s1[arraycntr] = temp[arraycntr];

}
4

1 回答 1

3

这不是一个作业,而是一个相等测试:

s1[arraycntr] == '\t'; 

你的意思是:

s1[arraycntr] = '\t';

如果您以高警告级别进行编译,编译器可能会发出一条消息,提醒您注意这一点。Microsoft VC 编译器发出以下警告:

C:\devel\cpp\stackoverflow\main.c(32) : 警告 C4553: '==' : 运算符无效;你打算'='吗?

初始for循环仅检查相同索引中是否s1具有s2相同的值,它不检查 char in 是否s1存在于s2. 循环的终止条件for也应该是 和 的长度,s1s2不是MAXLTR

size_t arraycntr,comparecntr;
for(comparecntr = 0; comparecntr < strlen(s2); comparecntr++)
{
    for(arraycntr = 0;arraycntr < strlen(s1) ;arraycntr++)
    {
        if(s1[arraycntr] == s2[comparecntr])
            s1[arraycntr] = `\t`;
    }
}

下一个for循环也应该使用strlen(s1)并且只需将空终止符分配给tempafter:

comparecntr = 0;
for(arraycntr = 0; arraycntr < strlen(s1); arraycntr++)
{
    if(s1[arraycntr] != `\t`)
    {
        temp[comparecntr] = s1[arraycntr];
        ++comparecntr;
    }
}
temp[comparecntr] = '\0';

temp未在任何地方初始化,因此包含随机数据,除了在此期间刚刚输入的数据for。中没有空终止符temps1也将不以空终止符结尾(之后您可能会看到垃圾打印)。最后,就strlen(temp) + 1在填充时s1

for(arraycntr = 0;arraycntr < strlen(temp) + 1; arraycntr++)
    s1[arraycntr] = temp[arraycntr];

会将空+ 1终止符复制到s1.

次要注意,您可以存储它而不是调用循环strlen()的终止条件:for

size_t chars_to_copy;
for(arraycntr = 0, chars_to_copy = strlen(temp) + 1;
    arraycntr < chars_to_copy;
    arraycntr++)
{
    s1[arraycntr] = temp[arraycntr];
}
于 2012-06-29T10:18:26.940 回答