关于#c语言#的问题:在进行删除字符串Str中的第n个ch字符时

在进行删除字符串Str中的第n个ch字符时,卡住了,不能继续运行,这是为什么?

img


#include <stdio.h>
#include <string.h>

unsigned int NumofChar(char * str,char ch)//查找字符串str中有多少个字符ch
{
    int count = 0;
    while(*str)
    {
        if(*str == ch)//解引用取出字符与ch比较,指针本身改变
            ++count;
        ++str;//使用指针指向每个字符所在的内存位地址
    }
    return count;
}



char * DelChar(char *str,char ch,unsigned int n)//删除字符串Str中的第n个ch字符
{
    char *p=str;
    unsigned int a=1,i=1;
    while(*str!='\0')
    {
        if(*str==ch)
        {
            a++;
            for(;1;i++)
            {
               if(*str!=ch&&a==n)
               {
                  *p++=*str;break;
               }
            }
        }
        str++;
    }
}


int main(void)
{
    char str[200]; // 保存字符串
    printf("What sentence do you want to enter?\n");
    scanf("%s",str);
    getchar();
    char ch;
    printf("Which character do you want to know\n");
    scanf("%c",&ch);
    int count=NumofChar(str,ch);
    printf("There are %d characters you are looking for.\n",count);
    unsigned int n;
    printf("What character do you want to remove?\n");
    scanf("%d",&n);
    getchar();
    DelChar(str,ch,n);
    printf("The resulting string is");
    puts(str);
    return 0;
}

仅供参考,谢谢!

img


#include <stdio.h>
#include <string.h>
unsigned int NumofChar(char *str, char ch)    // 查找字符串str中有多少个字符ch
{
    int count = 0;
    while (*str)
    {
        if (*str == ch)            // 解引用取出字符与ch比较,指针本身改变
            ++count;
        ++str;                    // 使用指针指向每个字符所在的内存位地址
    }
    return count;
}

void DelChar(char *str, char ch, unsigned int n)    // 删除字符串Str中的第n个ch字符
{
    char *p = str;
    unsigned int a = 0;
    while (*str != '\0')
    {
        if (*str == ch)
        {
            a++;
            if (a == n)
            {
                *str = '\0';
                strcat(p, str + 1);
                return;
            }

        }
        str++;
    }
}

int main(void)
{
    char str[200];                // 保存字符串
    printf("What sentence do you want to enter?\n");
    scanf("%s", str);
    getchar();

    char ch;
    printf("Which character do you want to know\n");
    scanf("%c", &ch);
    int count = NumofChar(str, ch);
    printf("There are %d characters you are looking for.\n", count);

    unsigned int n;
    printf("What character do you want to remove?\n");
    scanf("%d", &n);
    getchar();

    DelChar(str, ch, n);
    printf("The resulting string is:\n");
    puts(str);

    return 0;
}


if(*str!=ch&&a==n)这是要干啥呀
删除第n个ch,先要把第n个ch的索引找到,把这个索引后面的所有字符往前面挪一个,就完成了删除
你这逻辑不合逻辑呀

题主代码修改如下,改动处见注释,供参考:

#include <stdio.h>
#include <string.h>

unsigned int NumofChar(char* str, char ch)//查找字符串str中有多少个字符ch
{
    int count = 0;
    while (*str)
    {
        if (*str == ch)//解引用取出字符与ch比较,指针本身改变
            ++count;
        ++str;//使用指针指向每个字符所在的内存位地址
    }
    return count;
}



void DelChar(char* str, char ch, unsigned int n)//删除字符串Str中的第n个ch字符  修改 char *
{
    char* p = str;
    unsigned int a = 0;  //unsigned int a = 1, i = 1; 修改
    while (*str != '\0')
    {
        if (*str == ch)
        {
            a++;
            //for (; 1; i++)  修改
            //{
            if (a == n) //if (*str != ch && a == n) 修改
            {
                str++;  //*p++ = *str; break;    修改
            }
            //}修改
        }
        if (*str)  //}修改
            *p++ = *str++; // 修改
    }
    *p = '\0';   // 修改
}


int main(void)
{
    char str[200]; // 保存字符串
    printf("What sentence do you want to enter?\n");
    scanf("%s", str);
    getchar();
    char ch;
    printf("Which character do you want to know\n");
    scanf("%c", &ch);
    int count = NumofChar(str, ch);
    printf("There are %d characters you are looking for.\n", count);
    unsigned int n;
    printf("What character do you want to remove?\n");
    scanf("%d", &n);
    getchar();
    DelChar(str, ch, n);
    printf("The resulting string is:");
    puts(str);
    return 0;
}