用户定义的函数类似于squeeze()

时间:2012-06-29 10:12:40

标签: c

所以我正在尝试在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];

}

1 个答案:

答案 0 :(得分:3)

这不是一项任务,而是一项平等考试:

s1[arraycntr] == '\t'; 
你的意思是:

s1[arraycntr] = '\t';

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

  

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

初始for循环仅检查s1s2在相同索引中是否具有相同的值,但不检查s1中的字符是否存在于s2fors1循环的终止条件也应该是s2MAXLTR的长度,而不是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)循环也应该使用temp,只需在comparecntr = 0; for(arraycntr = 0; arraycntr < strlen(s1); arraycntr++) { if(s1[arraycntr] != `\t`) { temp[comparecntr] = s1[arraycntr]; ++comparecntr; } } temp[comparecntr] = '\0'; 之后将空终结符分配给temp

for

temp未在任何地方初始化,因此除了刚刚在此s1期间输入的数据外,还包含随机数据。如果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]; } 循环的终止条件中调用{{1}},而不是存储它:

{{1}}