C练习删除s1中s2中的所有字符
练习: 删除s1中s2中的所有字母: 我的代码是: 我不明白怎么了,有人能帮我吗C练习删除s1中s2中的所有字符,c,for-loop,c-strings,function-definition,remove,C,For Loop,C Strings,Function Definition,Remove,练习: 删除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] ==
#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;
}
#包括
#包括
空隙挤压(字符s1[],字符s2[]
{
int i,j;
i=j=0;
对于(i;s2[i]!='\0';i++){
对于(j;s1[j]!='\0';j++){
if(s1[j]==s2[i]){
s1[j]=s1[j+1];
--j;
}
}
}
}
int main()
{
字符w1[]=“abcde”;
字符w2[]=“fghaj”;
挤压(w1,w2);
puts(w1);
返回0;
}
但结果是:
abcde
我应该修复什么?挤压中的两个问题:
j
重新初始化为零压缩
改写为:
void squeeze(char s1[], char s2[])
{
int i,j;
i=j=0;
for( ; s2[i]!='\0'; i++) {
for (j = 0; s1[j] != '\0'; j++) {
if (s1[j] == s2[i]) {
strcpy(s1+j, s1+j+1);
--j;
}
}
}
}
首先,对于外循环的每次迭代,内循环中的变量
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;
}
如果不允许使用标准字符串函数和指针,那么程序可以按以下方式运行
#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;
}
我在这里看到一个问题,由于某些原因,您的代码没有输入此语句:
if (s1[j] == s2[i]) {
s1[j] = s1[j + 1];
--j;
}
你的问题可能是为什么?因为i和j未设置为0,请尝试打印它们,您将看到j将移动到4,但我将永远保持为0
因此,作为一个开始,你可以通过这样做来修复它
for(i=0; s2[i]!='\0'; i++) {
for (j=0; s1[j] != '\0'; j++) {
然后,您没有复制整个字符串并将其向后移动一步以重写找到的字符,您只移动了一个字符并将其留空
例
要解决此问题,有两种方法:
使用strcpy
将代码向后移动一步
for(i=0; s2[i]!='\0'; i++) {
for (j=0; s1[j] != '\0'; j++) {
if (s1[j] == s2[i]){
strcpy(s1+j, s1+j+1);
--j;
}
}
或者,您可以简单地使用一个用于
for(i=0; s2[i]!='\0'; i++) {
for (j=0; s1[j] != '\0'; j++) {
if (s1[j] == s2[i]){
for (k=j;s1[k] != '\0';k++)
s1[k] = s1[k + 1];
--j;
}
}
您是否已尝试在调试器中逐个语句地遍历代码语句?它告诉你什么?我是一个初学者,所以它告诉我什么,而且我从来没有使用过调试器,然后把这当作学习如何使用调试器的最佳时机。如果你想做任何类型的编程,能够使用调试器是必须的。谢谢,我会看到itokay谢谢,但是没有“strcpt”怎么做?写另一个循环来做strcpy所做的事情。我试着:void-squence(char-s1[],char-s2[]){int-i,j,k;for(i=0;s2[i]!='\0';i++{for(j=0;s1 j]!='\0';j++){if(s1[j]==s2[i]){for(k=j;k!='\0';k++){s1[k]=s1[k+1];}}}}但它仍然没有work@BobJarvis-恢复Monica使用strcpy提供的代码具有未定义的行为。谢谢,但我必须在没有指针的情况下执行此操作/indicators@HGH指标是什么?我是说'*“只是不知道用英语怎么说,指针?index?@HGH查看我的更新答案。谢谢,但是没有“strcpy”怎么办?我知道我应该使用第三个循环,但我不知道如何…@HGH我不确定你是否看到最后一部分,尝试刷新页面,因为我已经写了如何使用相同的strcpy函数使用for boucleyeah,页面没有刷新,现在我可以看到了,非常感谢!我是如此接近。。。我讨厌C…@HGH我很高兴我能帮助你。不要放弃,试着用更多的例子来实现你的解决方案
input : abcde
output :b_cde
for(i=0; s2[i]!='\0'; i++) {
for (j=0; s1[j] != '\0'; j++) {
if (s1[j] == s2[i]){
strcpy(s1+j, s1+j+1);
--j;
}
}
for(i=0; s2[i]!='\0'; i++) {
for (j=0; s1[j] != '\0'; j++) {
if (s1[j] == s2[i]){
for (k=j;s1[k] != '\0';k++)
s1[k] = s1[k + 1];
--j;
}
}
#include <stdio.h>
#include <string.h>
int rem_str(char * porgstr, char * pdel) {
if (!porgstr || !pdel) {
return 0;
}
int i = 0;
int j = 0;
char tmp[256] = {0};
int len = strlen(pdel);
for (i = 0; i < len; i++) {
tmp[pdel[i]]++;
}
len = strlen(porgstr);
for (i = 0, j=0; i < len; i++) {
if(tmp[porgstr[i]] == 0) {
porgstr[j] = porgstr[i];
j++;
}
}
porgstr[j] = 0;
return 0;
}
int main () {
char * input1 = strdup("origional string passed to program");
char * input2 = strdup("sdel");
printf("Input before del : %s\n", input1);
rem_str(input1, input2);
printf("String after del : %s\n", input1);
return 0;
}
./a.out
Input before del : origional string passed to program
string after del : origiona tring pa to program