我正在使用reverse函数。
void reverse(char s[]) {
int i, j;
char c;
for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}如果传递一个类型为char a[] = "abcd"的字符串,则得到输出dcba。
但如果我通过了char *a = "abcd",我得到了bus error。
我能否以某种方式反转char *类型的字符串?
源代码:
#include <stdio.h>
#include <string.h>
void reverse(char s[]);
int main() {
char a* = "abcd";
reverse(a);
printf("%s", a);
}
void reverse(char s[]) {
int i, j;
char c;
for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}发布于 2022-05-03 09:36:39
没有char *类型的字符串。字符串是以零字符'\0'结尾的一系列字符.
在这个声明中(有一个错误的char a* = "abcd";)
char *a = "abcd";声明了一个指向字符串文本的指针。字符串文本本身具有char[5]类型。但作为初始化器表达式,它被隐式转换为指向其类型char *的第一个元素的指针。
您正在尝试更改函数reverse中的指针指向的字符串文本。
但是,您可能不会更改字符串文本。任何更改字符串文字的尝试都会导致未定义的行为。
来自C标准(6.4.5字符串文本)
如果
7的元素具有适当的值,则未指定这些数组是否是不同的。如果程序试图修改这样的数组,则行为是未定义的.。
您可以做的是创建一个新的字符串,它将以相反的顺序存储源字符串文本的字符。
例如
char * reverse_copy( const char *s )
{
size_t n = strlen( s );
char *t = malloc( n + 1 );
if ( t != NULL )
{
t += n;
*t = '\0';
while ( *s ) *--t = *s++;
}
return t;
}而这个函数可以调用如下
char *s = "abcd";
char *p = reverse_copy( s );
if ( p != NULL ) puts( p );
free( p );这是一个演示程序。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
char *reverse_copy( const char *s )
{
size_t n = strlen( s );
char *t = malloc( n + 1 );
if (t != NULL)
{
t += n;
*t = '\0';
while (*s) *--t = *s++;
}
return t;
}
int main( void )
{
char *s = "abcd";
char *p = reverse_copy( s );
if (p != NULL) puts( p );
free( p );
}程序输出是
dcba发布于 2022-05-03 09:35:51
你的反向功能没问题。问题是通过这样做实例化字符串为文字:char *a = "abcd"; (它是'*a‘不是'a*’顺便说一句)
不能修改字符串文本。要测试您的函数,您可以这样做:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void reverse(char s[]);
int main(){
char *a = malloc(sizeof(char) * 5);
if (a == NULL)
return 1;
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
a[3] = 'd';
a[4] = '\0';
reverse(a);
printf("%s", a);
free(a);
}
void reverse(char s[]){
int i, j;
char c;
for (i = 0, j = strlen(s) - 1; i<j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}https://stackoverflow.com/questions/72097221
复制相似问题