strcat给了我一个分段错误

strcat给了我一个分段错误,c,arrays,char,append,strcat,C,Arrays,Char,Append,Strcat,在确认strcat是错误发生的地方之后,我检查了作业中的前一个示例。在我前面的示例中,我使用strcat(实际上是strncat)的方式与我在下面代码中使用的方式相同。我不太确定 我的程序的目的是在“字符串”中循环,并从字符串中删除字符“c”中出现的任何内容 主要条款c: char string[100]={0}, c[3]; printf("Enter a String: "); fgets(string, 100, stdin); if (string[98] == '\n' &a

在确认strcat是错误发生的地方之后,我检查了作业中的前一个示例。在我前面的示例中,我使用strcat(实际上是strncat)的方式与我在下面代码中使用的方式相同。我不太确定

我的程序的目的是在“字符串”中循环,并从字符串中删除字符“c”中出现的任何内容

主要条款c:

 char string[100]={0}, c[3];

 printf("Enter a String: ");
 fgets(string, 100, stdin);
 if (string[98] == '\n' && string[99] == '\0') { while ( (ch = fgetc(stdin)) != EOF && ch != '\n'); }

 printf("Enter a Char: ");
 fgets(c, 2, stdin);
 while ( (ch = fgetc(stdin)) != EOF && ch != '\n');

 rmchr(string, c[0]); 
标题:

rmchr(char *string, char c)
{ 
  int i=0;
  char *word[100];

  int s = strlen(string);

  for(i=0; i<=(s-2); i++)
  {
    if(string[i] != c)
    {
      strcat(word, string[i]);
    }
  }  
}
rmchr(字符*字符串,字符c)
{ 
int i=0;
字符*字[100];
int s=strlen(字符串);
对于(i=0;i
它将在您的程序中保存一个字符串,因此请使用:

char word[100];
也就是说,一个
char
数组,而不是
char*
数组

然后,
strcat
连接到一个字符串,但
word
未初始化。使用以下命令将其设置为字符串:

word[0] = '\0';
然后
string[i]
是一个字符,但是
strcat
需要指向字符参数的指针:要使用指针,请使用
&string[i]


最后,
rmchr
函数中的问题是它必须通过参数或返回语句返回某些内容,但它没有返回

  • rmchr()

    [FWIW,在这种情况下,我想知道如何使用局部变量
    word
    ]

  • rmchr()
    内部,
    word
    需要是
    char
    s的数组,而不是
    char
    指针。您需要将
    char*word[100]
    更改为
    char-word[100]

  • strcat()
    中,两个参数都需要是指针。在这种情况下,您需要使用
    &string[i]


  • 下面的代码似乎编译得很好,但您的代码并没有达到您所希望的效果,“我的程序的目的是循环遍历“string”,并从string中删除任何字符“c”出现的情况。”。函数不会删除字符或返回排除字符的字符串副本。我编写了一个函数,在删除字符后复制字符串并返回指向该字符串的指针。下面是您的代码,下面是我的函数

    //Just a compilable version of your code, not sure if it does what u want
    #include <stdio.h>
    #include <string.h>
    
    void rmchr(char *string, char c)   
    { 
        int i=0;
        char word[100];
    
        int s = (int)strlen(string);
    
        for(i=0; i<=(s-2); i++)
        {
            if(string[i] != c)
            {
                strcat(word, (char *)(&string[i]));
            }
        }  
    }
    
    int main(int argc, const char * argv[]) {
        char string[100] = {0}, c[3];
        char ch;
    
        printf("Enter a String: ");
        fgets(string, 100, stdin);
        if (string[98] == '\n' && string[99] == '\0') { 
           while ( (ch = fgetc(stdin)) != EOF && ch != '\n'); 
        }
    
        printf("Enter a Char: ");
        fgets(c, 2, stdin);
        while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
    
        rmchr(string, c[0]); 
    
        return 0;
    }
    
    //只是代码的可编译版本,不确定它是否符合您的要求
    #包括
    #包括
    void rmchr(字符*字符串,字符c)
    { 
    int i=0;
    字符字[100];
    int s=(int)strlen(字符串);
    
    对于(i=0;i
    strcat(字,字符串[i])
    本应无法编译。GCC有时会将字符串函数声明为内部函数,即使程序员忘记了
    #包含
    。您的头文件中有rmchr函数?如果是这样,它应该移动到C文件中。顺便说一句,我会使用更少的幻数(如100)和更多的常量(如
    LONGESTWORD
    或expressio)ns就像
    sizeof(array)
    (但不是指针!)。@user2864740绝对是,但这是最基本的要求。否则,任何一个像样的编译器都会尖叫的。:)
    //Just a compilable version of your code, not sure if it does what u want
    #include <stdio.h>
    #include <string.h>
    
    void rmchr(char *string, char c)   
    { 
        int i=0;
        char word[100];
    
        int s = (int)strlen(string);
    
        for(i=0; i<=(s-2); i++)
        {
            if(string[i] != c)
            {
                strcat(word, (char *)(&string[i]));
            }
        }  
    }
    
    int main(int argc, const char * argv[]) {
        char string[100] = {0}, c[3];
        char ch;
    
        printf("Enter a String: ");
        fgets(string, 100, stdin);
        if (string[98] == '\n' && string[99] == '\0') { 
           while ( (ch = fgetc(stdin)) != EOF && ch != '\n'); 
        }
    
        printf("Enter a Char: ");
        fgets(c, 2, stdin);
        while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
    
        rmchr(string, c[0]); 
    
        return 0;
    }
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char* rmchr(char *string, char ch)
    { 
        int counter = 0;
        int new_size = 0;
        char corrected_string[100];
    
        while (string[counter] != '\n' && string[counter] != '\0' && string[counter] != EOF)  {
            if (string[counter] != ch) {
                corrected_string[new_size] = string[counter];
                new_size++;
            }
            counter++;
        }
        char *new_string = (char *)malloc((new_size+1) * sizeof(char));
    
        for (int j = 0; j <= new_size; j++) {
            new_string[j] = corrected_string[j];
        }
        return new_string;
    }
    
    int main(int argc, const char * argv[]) {
    
        char *s = "The char 'c' will be removed";
        char *new = rmchr(s, 'c');
        printf("%s", new);
        return 0;
    }