【问题标题】:strcat is giving me a segmentation fault errorstrcat 给我一个分段错误错误
【发布时间】:2015-12-19 23:28:57
【问题描述】:

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

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

main.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]);
    }
  }  
}

【问题讨论】:

  • strcat(word, string[i]); 应该编译失败。
  • GCC 有时将字符串函数声明为内在函数,即使程序员忘记了#include &lt;string.h&gt;
  • 你的头文件中有rmchr函数吗?如果是这样,它应该被移动到一个 C 文件中。
  • 顺便说一句,我会使用更少的幻数,比如 100,更多的常量,比如 LONGESTWORD 或者像 sizeof(array) 这样的表达式(但不是指针!)。

标签: c arrays char append strcat


【解决方案1】:
char *word[100];

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

char word[100];

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

然后strcat 连接到一个字符串,但word 未初始化。将其设为字符串:

word[0] = '\0';

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

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

【讨论】:

    【解决方案2】:

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

    1. rmchr() 定义应该有一个返回类型,如果你没有返回任何东西,可能是void

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

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

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

    【讨论】:

    • @user2864740 绝对是,但这是最基本的要求。否则,任何体面的编译器都会尖叫。 :)
    【解决方案3】:

    以下似乎编译得很好,但您的代码并没有完全按照您所说的那样做,“我的程序的目的是遍历“字符串”并从字符串中删除任何出现的字符“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;
    }
    

    你去,有一个演示主要

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2020-10-05
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      相关资源
      最近更新 更多