尝试反转字符串时发生分段错误
Segmentation fault occuring when trying reverse a string
所以我有这个函数应该反转一个字符串然后 return 它
char *my_revstr(char *str)
{
int i = 0;
int j = 0;
int k = 0;
while(str[j] != '[=10=]') {
j++;
}
j--;
while(i < j) {
k = str[i];
str[i] = str[j];
str[j] = k;
i++;
j--;
}
return (str);
}
但每当我尝试 运行 它时,我都会遇到分段错误,老实说,我不太清楚为什么。我希望有人能帮我解决这个问题^^。
我确定你有一个分段错误,因为传递给函数的字符串文字类似于
my_revstr( "Hello" );
您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。
你应该这样写
char s[] = "Hello";
my_revstr( s );
注意变量i和j应该是size_t
类型,因为int
类型可能不够大,无法存储字符串的大小。
该函数可以通过以下方式定义,如下面的演示程序所示,
#include <stdio.h>
char * my_revstr( char *s )
{
size_t n = 0;
while ( s[n] != '[=12=]' ) ++n;
if ( n != 0 )
{
for ( size_t i = 0; i < --n; ++i )
{
char c = s[n];
s[n] = s[i];
s[i] = c;
}
}
return s;
}
int main(void)
{
char s[] = "Hello";
puts( s );
puts( my_revstr( s ) );
return 0;
}
程序输出为
Hello
olleH
函数也可以定义为例如下面的方式
char * my_revstr( char *s )
{
size_t n = 0;
while ( s[n] != '[=14=]' ) ++n;
for ( size_t i = 0; i < n / 2; ++i )
{
char c = s[i];
s[i] = s[n - i - 1];
s[n - i - 1] = c;
}
return s;
}
或者您可以使用指针实现函数。例如
char * my_revstr( char *s )
{
char *first = s, *last = s;
while ( *last ) ++last;
if ( first != last )
{
for ( ; first < --last; ++first )
{
char c = *first;
*first = *last;
*last = c;
}
}
return s;
}
所以我有这个函数应该反转一个字符串然后 return 它
char *my_revstr(char *str)
{
int i = 0;
int j = 0;
int k = 0;
while(str[j] != '[=10=]') {
j++;
}
j--;
while(i < j) {
k = str[i];
str[i] = str[j];
str[j] = k;
i++;
j--;
}
return (str);
}
但每当我尝试 运行 它时,我都会遇到分段错误,老实说,我不太清楚为什么。我希望有人能帮我解决这个问题^^。
我确定你有一个分段错误,因为传递给函数的字符串文字类似于
my_revstr( "Hello" );
您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。
你应该这样写
char s[] = "Hello";
my_revstr( s );
注意变量i和j应该是size_t
类型,因为int
类型可能不够大,无法存储字符串的大小。
该函数可以通过以下方式定义,如下面的演示程序所示,
#include <stdio.h>
char * my_revstr( char *s )
{
size_t n = 0;
while ( s[n] != '[=12=]' ) ++n;
if ( n != 0 )
{
for ( size_t i = 0; i < --n; ++i )
{
char c = s[n];
s[n] = s[i];
s[i] = c;
}
}
return s;
}
int main(void)
{
char s[] = "Hello";
puts( s );
puts( my_revstr( s ) );
return 0;
}
程序输出为
Hello
olleH
函数也可以定义为例如下面的方式
char * my_revstr( char *s )
{
size_t n = 0;
while ( s[n] != '[=14=]' ) ++n;
for ( size_t i = 0; i < n / 2; ++i )
{
char c = s[i];
s[i] = s[n - i - 1];
s[n - i - 1] = c;
}
return s;
}
或者您可以使用指针实现函数。例如
char * my_revstr( char *s )
{
char *first = s, *last = s;
while ( *last ) ++last;
if ( first != last )
{
for ( ; first < --last; ++first )
{
char c = *first;
*first = *last;
*last = c;
}
}
return s;
}