所以我正在尝试在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];
}
答案 0 :(得分:3)
这不是一项任务,而是一项平等考试:
s1[arraycntr] == '\t';
你的意思是:
s1[arraycntr] = '\t';
如果使用高警告级别进行编译,编译器可能会发出一条消息,提醒您这一情况。 Microsoft VC编译器发出以下警告:
C:\ devel \ cpp \ stackoverflow \ main.c(32):警告C4553:'==':运算符无效;你打算'='吗?
初始for
循环仅检查s1
和s2
在相同索引中是否具有相同的值,但不检查s1
中的字符是否存在于s2
中for
。 s1
循环的终止条件也应该是s2
和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)
循环也应该使用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}}