字符串逆序输出问题
函数接口定义:void f( char *p );
函数f对p指向的字符串进行逆序操作。要求函数f中不能定义任何数组,不能调用任何字符串处理函数。
#include <stdlib.h>
void f( char *p )
{
int i = 0;
char *a;
while (*p != '\0')
{
i ++;
p ++;
}
a = (char *)malloc(i);
int m = 0;
int t = 0;
p = p-i;
for (m = i-1;m >= 0; m--)
{
a = p;
t ++;
}
a = '\0';
p = a;
}
如上代码,在dev-c++里可以正常执行,在PTA那个平台里就不行,不知是哪里问题 humm,感觉你这个方法转换不了啊,我在本机上进行测试了一下,也不行。
你可以试试这个代码,正好符合你的要求
void f(char* s) {
// p指向字符串头部
char* p = s ;
// q指向字符串尾部
char* q = s ;
while( *q )
++q ;
q -- ;
// 交换并移动指针,直到p和q交叉
while(q > p) {
char t = *p ;
*p++ = *q ;
*q-- = t ;
}
}
然后你的第11行的代码应该是算创建了数组的把。 void f(char * p)
{
int c , i , n ;
for(n = 0 ; p ; n ++) ;
for(i = 0 ; i < n / 2 ; i ++) {
c = p ;
p = p ;
p = c ;
}
} 本帖最后由 一叶枫残 于 2021-2-15 18:57 编辑
我知道你那个问题在哪了:
首先,传入的是一个指针(字符串名就是一个指针,储存的是地址值),因为函数是值传递,它给的是那个地址值,不是那个指针,你只能修改这个地址值的解引用也就是值,你在函数修改其地址值并不对main里面的s的地址值产生任何影响,看下面代码就清楚了
#include <stdio.h>
#include <stdlib.h>
#define MAXS 20
void f( char *p );
void ReadString( char *s ); /* 由裁判实现,略去不表 */
int main()
{
char s;
printf("主函数里:");
printf("开始时s的地址:%x\n",s);
printf("请输入字符串:");
gets(s);
f(s);
printf("主函数里:调用函数后s的地址:%x\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
void f( char *p )
{
printf("\n函数f里:\n开始时p的地址:%x\n",p);
int i = 0;
char *a;
printf("开始时a的地址:%x\n",a);
while (*p != '\0')
{
i ++;
p ++;
}
a = (char *)malloc(i);
printf("分配内存后时a的地址:%x\n",a);
int m = 0;
int t = 0;
p = p-i;
for (m = i-1;m >= 0; m--)
{
a = p;
t ++;
}
a ='\0';
p = a;
printf("结束后p的地址:%x\n",p);
printf("结束后a的地址:%x\n\n",a);
}
主函数里:开始时s的地址:62fe00
请输入字符串:abcd
函数f里:
开始时p的地址:62fe00
开始时a的地址:62fd70
分配内存后时a的地址:986ad0
结束后p的地址:986ad0
结束后a的地址:986ad0
主函数里:调用函数后s的地址:62fe00
你看地址都没有改变,怎么可能实现,还有的是,在PTA里没给出#include<stdlib.h>,意味着你不能使用malloc,一开始出发思路就错了,其实正确做法是调换值,例如字符串是abcd,a和d调换,b和c调换,就变成了dcba了,这个是可以实现的,因为地址值不能改变,但是其解引用后的值可以改变
页:
[1]