簡體   English   中英

反轉字符串時出現“分段錯誤核心轉儲錯誤”

[英]Getting “Segmentation fault Core Dumped Error ” while reversing a string

我正在嘗試學習C,在反轉字符串時遇到此錯誤。 我不太熟悉內存分配的東西,請您指出我做錯的地方。

#include<stdio.h>
#include<string.h>
char* strrev(char *str);
int main()
{
  char str[1000];
  char *str1;
  printf("Please enter a String\n");
  gets(str);

  str1=strrev(str);
  puts(str1);

}

char* strrev(char *str)
{
  char *str1;
  int i,length,c;
  length=strlen(str);

  for (i=length-1;i<=0;i--)
  {
     *(str1+c) = *(str+i);
     c++;
  }
  *(str1+c) ='\0';
  return str1;

}

在您的strrev()函數中,未為str1分配內存。 因此, *(str1+c) = *(str+i); UB

然后, c是一個自動局部變量,在使用前未初始化。 也UB。

接下來, 如Giorgi所述 ,更正您的for循環。

就是說,不要使用gets() ,它會遇到緩沖區溢出問題。 使用fgets()代替。

  for (i=length-1;i<=0;i--)

由於i<=0 ,它將永遠不會運行(除非字符串是0或1個字符長),可能應該是i>=0

通常,還需要使指針指向一些有效內存,以便能夠取消引用它。 在您的情況下,您可能應該使用malloc分配足夠的字節數,並將其結果分配給str1 然后,您可以在執行操作時對其進行寫操作。

在您的函數中,您沒有初始化c

int i,length,c;

並在for循環中使用它

*(str1+c) = *(str+i);

還有其他問題。

1)函數內部的str1未分配內存。

2)此循環將永遠不會執行,因為for (i=length-1;i<=0;i--)中的條件永遠不會為真(除非字符串為0或1個字符長)。

3)不要使用gets() ,它已被棄用。 而是使用fgets()

  1. 您沒有在strrev()初始化str1
  2. 如果輸入長度為2個字符或更多的字符串,則i<=0為假,並且不會執行for循環內的塊。
  3. *(str1+c) ='\\0'; 會導致崩潰,因為str1的值不確定,並且str1指向某個有效位置的機會很小。

UPD: strrev() c也未初始化,這引起一些麻煩。

您嘗試做的是不反轉字符串。 程序中兩個字符串都不會反轉。 您試圖以相反的順序將一個字符串復制到另一個字符串中。

因此,要以相反的順序復制原始字符串的sring應該有足夠的空間來存儲復制的字符。

但是在你的職能

char* strrev(char *str)
{
  char *str1
  //...

指針str1尚未初始化,並且沒有指向適當大小的內存范圍。

因此,您的程序具有未定義的行為。

還應考慮到功能gets是不安全的,並且C標准不再支持該功能。 請改用功能fgets

如果您的編譯器支持可變長度數組(VLA),則程序可以采用以下方式

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

char * reverse_copy( char *s2, const char *s1 )
{
    size_t n = strlen( s1 );
    size_t i = 0;

    for ( ; i < n; i++ ) s2[i] = s1[n-i-1];

    s2[i] = '\0';

    return s2;
}

int main( void )
{
    char s1[1000];

    printf( "Please enter a String: " );
    fgets( s1, sizeof( s1 ), stdin );

    size_t n = strlen( s1 );

    if ( n != 0 && s1[n-1] == '\n' ) s1[n-1] = '\0';

    char s2[n + 1];

    puts( s1 );
    puts( reverse_copy( s2, s1 ) );

    return 0;
}

例如輸入

Hello Asfakul Islam

然后輸出看起來像

Please enter a String: Hello Asfakul Islam
Hello Asfakul Islam
malsI lukafsA olleH

否則,如果您的編譯器不支持VLA,則需要動態分配適當大小的數組。 在這種情況下,程序可以例如通過以下方式查找

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

char * reverse_copy( char *s2, const char *s1 )
{
    size_t n = strlen( s1 );
    size_t i = 0;

    for ( ; i < n; i++ ) s2[i] = s1[n-i-1];

    s2[i] = '\0';

    return s2;
}

int main( void )
{
    char s1[1000];

    printf( "Please enter a String: " );
    fgets( s1, sizeof( s1 ), stdin );

    size_t n = strlen( s1 );

    if ( n != 0 && s1[n-1] == '\n' ) s1[n-1] = '\0';

    char *s2 = malloc( ( n + 1 ) * sizeof( char ) );

    puts( s1 );
    puts( reverse_copy( s2, s1 ) );

    free( s2 );

    return 0;
}

暫無
暫無

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

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