【发布时间】:2013-09-17 16:44:12
【问题描述】:
这是我试图解决但找不到更简单方法的问题:-
编写一个函数 squeez,删除 s1 中与字符串 s2 中任何字符匹配的每个字符。
到目前为止我所做的是以下代码:-
#include<stdio.h>
#include<string.h>
char *mysqueeze(char *a, char *b);
int main(void)
{
int j = 0;
char s1[100] = "krishna";
char s2[100] = "kareem";
char real[100];
char *t = mysqueeze(s1,s2);
for (int i = 0; i <= strlen(t); i++) //1
if (t[i] != '*')
real[j++] = t[i];
real[j] = '\0'; //4
printf("%s\n", real);
}
char *mysqueeze(char *a, char *b)
{
int i = 0, k;
do
{
k = 0;
while (b[k] != '\0')
{
if (a[i] == b[k]) {
a[i] = '*';
break;
}
k++;
}
i++;
}
while (a[i]);
return a;
}
如何改进此代码?如何将 1 到 4 移至代码的循环部分?
【问题讨论】:
-
使用与“p”不同的标记。也许是像'*'这样的符号。
-
看看标准库函数strspn()和strcspn()。
-
保留两个索引,一个用于您正在查看的角色,一个用于如果您正在查看的角色不在拒绝列表中,您将复制到的位置。最初,这两个索引将相同,为零。对于字符串中的每个字符,如果它不在拒绝列表中,则将其复制到当前复制到位置并增加复制到索引。增加查看索引。重复直到 EOS。将空终止符添加到复制到位置。
-
1.正确拼写您的函数名称; 2、不要在循环条件中使用
strlen(); 3. 不要使用像a和b这样的变量名,除非作为通用循环计数器; 4.不要比较有符号和无符号整数; 5. 正确缩进你的代码,即使是一行循环或条件语句也要使用大括号; 6.从main()正确返回,即使技术上没有要求; 7. 让一个函数完成整个工作,而不是让它完成一半工作,以至于调用者必须在它返回后完成工作。 -
8.使用
-Wall -Werror编译,9.使用strchr:这个函数可以写成四行代码。