strcat 给我一个分段错误

strcat is giving me a segmentation fault error

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

我的程序的目的是遍历 "string" 并从字符串中删除任何出现的字符 'c'。

main.c:

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

 printf("Enter a String: ");
 fgets(string, 100, stdin);
 if (string[98] == '\n' && string[99] == '[=10=]') { 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]); 

header:

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]);
    }
  }  
}
char *word[100];

它将在您的程序中保存一个字符串,因此请使用:

char word[100];

char的数组,而不是char *的数组。

然后 strcat 连接到一个字符串,但 word 未初始化。使它成为一个字符串:

word[0] = '[=12=]';

那么 string[i] 是一个字符,但是 strcat 需要指向字符参数的指针:要使用指针,请使用 &string[i].

最后,你的 rmchr 函数中的问题是它必须 return 一些东西,要么通过参数,要么通过 return 语句,但它没有。

这里要提的不止一点,比如

  1. rmchr() 定义应该有一个 return 类型,也许 void 如果你没有 returning 任何东西。

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

  2. rmchr()中,word需要是一个char数组,而不是char指针。您需要将 char * word[100] 更改为 char word[100]

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

以下内容似乎可以正常编译,但您的代码并没有完全按照您的要求执行,"The purpose of my program is to loop through "string" 并从字符串中删除任何出现的字符 'c'。"。该函数不会删除字符或 return 排除字符的字符串副本。我写了一个函数,在删除字符和指向它的 returns 指针后复制字符串。下面是你的代码稍微修改一下,下面是我的函数

//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] == '[=10=]') { 
       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] != '[=11=]' && 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;
}