【问题标题】:Segmentation Fault- C programming分段错误 - C 编程
【发布时间】:2014-07-10 21:05:55
【问题描述】:

这个程序应该读取 10 个字符串并打印以“ed”结尾的字符串,但是即使它编译,在我输入第一个字符串后我仍然遇到分段错误。我已经尝试了一切,但我无法弄清楚为什么。这是我的代码:

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

int main(void)
{
    //Declaration of array of strings
    char *strings[10];
    int i = 0;
    int len = 0;

    //Prompts user to enter 10 strings

    printf("Enter 10 strings: \n");

    //Loop to read in 10 strings

    for( i = 0; i < 10; i++)
    {
        fgets(strings[i], 100, stdin);
    }

    //Loop to traverse array of strings and print those ending with 'ed'

    printf("The strings that end with ed are:\n");

    for( i=0; i < 10; i++)
    {   

        len=strlen(strings[i]);

        len=len-1;

        if(*strings[len] =='e' && *strings[len-1] =='d')
        {
            printf("%s", strings[i]);
        }
    }
    return 0;
}//End of function main

【问题讨论】:

  • 你的程序将一个未初始化的指针传递给fgets()。
  • 将char *strings[10]更改为char strings[10][100]
  • fgets 应该写信到哪里?你还没有分配任何东西。
  • strings[i] 在你的循环之前没有被初始化。
  • char *strings[10] 不声明字符串数组。它只是声明了一个指向 char * 的指针数组,并且您不会将这些指针初始化为有效内存。因此,当您尝试访问字符串 [0] 时,您会出现段错误!

标签: c arrays string segmentation-fault coredump


【解决方案1】:

您尚未为 string 元素分配内存。为它分配内存。

for(int i = 0; i < 10; i++)
    strings[i] = malloc(100);  

最后不要忘记使用free 释放分配的内存。

for(int i = 0; i < 10; i++)
    free(string[i]);  

【讨论】:

    【解决方案2】:

    没有为字符串变量string 分配内存。你只声明了指向 10 个字符串的指针

    char *strings[10];
    

    字符串数组或变量没有内存,因此您必须分配它

     for(i=0;i<10;i++) {
          string[i]=malloc((max_length_of_string));
      }
    

    您可以将max_length_of_string 设为 100。

    【讨论】:

      【解决方案3】:

      按以下方式定义数组

      char strings[10][100];
      

      另外这段代码sn-p也不正确

      for( i=0; i < 10; i++)
      {   
      
          len=strlen(strings[i]);
      
          len=len-1;
      
          if(*strings[len] =='e' && *strings[len-1] =='d')
          {
              printf("%s", strings[i]);
          }
      }
      

      试试下面的

      for( i=0; i < 10; i++)
      {   
      
          len=strlen(strings[i]);
      
          if ( len && strings[i][len - 1] == '\n' ) --len;
      
          if ( len > 1 && strings[i][len - 1] =='d' && strings[i][len-2] =='e')
          {
              printf("%s", strings[i]);
          }
      }
      

      这是程序外观的示例

      #include <stdio.h>
      #include <string.h>
      
      int main( void )
      {
          //Declaration of array of strings
          const size_t N = 10;
          const size_t M = 100;
          char strings[N][M];
          size_t i;
          size_t len;
      
          //Prompts user to enter 10 strings
      
          printf( "Enter %u strings: \n", N );
      
          //Loop to read in 10 strings
      
          for ( i = 0; i < N; i++ )
          {
              fgets( strings[i], M, stdin );
          }
      
          //Loop to traverse array of strings and print those ending with 'ed'
      
          printf( "The strings that end with ed are:\n" );
      
          for ( i = 0; i < N; i++ )
          {   
              len = strlen( strings[i] );
      
              if ( len && strings[i][len - 1] == '\n' ) --len;
      
              if ( len > 1 && strings[i][len - 1] =='d' && strings[i][len - 2] =='e' )
              {
                  printf( "%s", strings[i] );
              }
          }
      
          return 0;
      }
      

      如果输入

      apple
      room
      horse
      finished
      close
      chicken
      city
      done
      success
      opened
      

      那么输出将是

      finished
      opened
      

      【讨论】:

      • @BLUEPIXY 你确定吗?
      • @VladfromMoscow:是的,因为 len 从 2 递减到 1,所以 len - 2 产生一个负索引。
      • @BLUEPIXY 哦,我弄错了。谢谢。
      【解决方案4】:

      其中一些问题可能超出了您的项目范围。

      • 您没有为字符串分配任何内存。
      • 您将未初始化的指针传递给fgets()。
      • 您没有充分处理输入字符串过长(超过 99 个字符)的问题。
      • 您没有充分处理输入字符串非常短(少于 2 个字符)的问题。
      • 您没有充分处理输入的数字或字符串少于预期的问题。
      • 您没有充分处理fgets() 的问题,包括结果字符串末尾的输入换行符。
      • 当你的意思是strings[i][len]时,你不正确地使用strings[len]。
      • 您正在检查"de",而不是按预期检查"ed"。

      以下是解决这些问题的一种可能的解决方案:

      int
      main (void)
      {
          char *strings[10] = {}, *x;
          int i;
          size_t len;
      
          puts("Enter 10 strings:");
          for (i = 0; i < 10; ++i) getline(&strings[i], &len, stdin);
          puts("The strings that end with ed are:");
          for (i = 0; i < 10; ++i) {
              if ((x = strings[i])) {
                  len = strlen(x);
                  if (x[len-1] == '\n') x[--len] = '\0';
                  if (len > 1 && strcmp(x + len - 2, "ed") == 0) puts(x);
                  free(x);
              }
          }
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-06-07
        • 1970-01-01
        • 1970-01-01
        • 2016-02-09
        • 1970-01-01
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        • 2017-11-10
        相关资源
        最近更新 更多