簡體   English   中英

分段故障-C編程

[英]Segmentation Fault- C programming

該程序應該讀取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

您尚未為string元素分配內存。 為此分配內存。

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

最后,不要忘記使用free釋放已分配的內存。

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

未為字符串變量string分配內存。 您只聲明了指向10個字符串的指針

char *strings[10];

字符串數組或變量沒有內存,因此您必須分配它

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

您可以將max_length_of_string設為100。

通過以下方式定義數組

char strings[10][100];

另外此代碼段不正確

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

其中一些問題可能超出了您項目的范圍。

  • 您沒有為字符串分配任何內存。
  • 您將未初始化的指針傳遞給fgets()
  • 您沒有充分處理輸入字符串過長(超過99個字符)的問題。
  • 您沒有充分處理輸入字符串非常短(少於2個字符)的問題。
  • 您沒有充分處理輸入少於預期數字或字符串的問題。
  • 您沒有充分處理fgets()的問題,包括在結果字符串末尾輸入的換行符。
  • 當您指的是strings[i][len]時,您會不正確地使用strings[len] strings[i][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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM