gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:21 25 4
gpt4 key购买 nike

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

}

最佳答案

这不是赋值,而是相等性测试:

s1[arraycntr] == '\t'; 

你的意思是:

s1[arraycntr] = '\t';

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

C:\devel\cpp\stackoverflow\main.c(32) : warning C4553: '==' : operator has no effect; did you intend '='?

最初的 for 循环只检查 s1s2 是否在相同的索引中有相同的值,它不检查一个字符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) 并在之后将空终止符分配给 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 也将以没有空终止符结尾(之后您可能会看到垃圾打印)。最后,在填充 s1 时只需 strlen(temp) + 1:

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

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

小提示,不是在 for 循环的终止条件中调用 strlen(),而是可以存储它:

size_t chars_to_copy;
for(arraycntr = 0, chars_to_copy = strlen(temp) + 1;
arraycntr < chars_to_copy;
arraycntr++)
{
s1[arraycntr] = temp[arraycntr];
}

关于c - 类似于 squeeze() 的用户定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11259936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com