[英]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;
}
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()
strrev()
初始化str1
i<=0
為假,並且不會執行for
循環內的塊。 *(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.