c - 如何从一个字符串中删除另一个字符串中的所有字符?
问题描述
我需要删除所有来自s1
. s2
我不明白我的代码有什么问题:
#include <stdio.h>
#include <stdlib.h>
void squeeze(char s1[], char s2[])
{
int i,j;
i=j=0;
for(i; s2[i]!='\0'; i++) {
for (j; s1[j] != '\0'; j++) {
if (s1[j] == s2[i]) {
s1[j] = s1[j + 1];
--j;
}
}
}
}
int main()
{
char w1[] = "abcde";
char w2[] = "fghaj";
squeeze(w1,w2);
puts(w1);
return 0;
}
但输出是:
abcde
我应该修理什么?
解决方案
对于初学者,对于外循环的每次迭代,变量j
不会在内循环中重置。0
其次,如果必须删除一个字符,那么它之后的所有字符都不会被移动到左边一个位置。您只需将删除的字符替换为字符串中的下一个字符。
该函数可以如下所示,如下面的演示程序所示。
#include <stdio.h>
#include <string.h>
char * squeeze( char s1[], const char s2[] )
{
for ( char *p = s1, *q = s1; *q; ++p )
{
if ( !*p || !strchr( s2, *p ) )
{
if ( q != p )
{
*q = *p;
}
if ( *p ) ++q;
}
}
return s1;
}
int main( void )
{
char w1[] = "abcde";
char w2[] = "fghaj";
puts( squeeze( w1, w2 ) );
return 0;
}
程序输出为
bcde
如果您不允许使用标准字符串函数和指针,那么程序可以如下所示。
#include <stdio.h>
char * squeeze( char s1[], const char s2[] )
{
for ( size_t i = 0, j = 0; s1[j] != '\0'; ++i )
{
size_t k = 0;
while ( s2[k] != '\0' && s2[k] != s1[i] ) ++k;
if ( s2[k] == '\0' )
{
if ( j != i )
{
s1[j] = s1[i];
}
if ( s1[i] != '\0' ) ++j;
}
}
return s1;
}
int main( void )
{
char w1[] = "abcde";
char w2[] = "fghaj";
puts( squeeze( w1, w2 ) );
return 0;
}
程序输出与前面的演示程序相同
bcde
推荐阅读
- c - 将 char 和 float 值传递给字符串
- composer-php - Composer GOS Websocket bundle symfony 2.8 依赖问题/异常
- sql - SQL - 使用触发器偶尔允许删除行
- react-native - 将导航作为道具传递
- python - 转换具有多个索引/标题的列
- kubernetes - 代理重启后java kafka-client无法重新连接
- ios - ld:未找到架构 x86_64 xcode 10 的符号
- webgl - 绑定到纹理单元 0 的 WebGL 纹理不可渲染错误
- c - spinlock_check() 函数的使用
- jquery - Jquery查找复选框并执行某个URL