LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1113|回复: 8

大家帮我看看这个C程序

[复制链接]
发表于 2004-3-25 13:50:25 | 显示全部楼层 |阅读模式
[PHP]
#include <stdio.h>

void rev(char* s, int ln, char* sr){
    sr += ln-1;
    for(;*s;s++,sr--) *sr=*s;
    sr[ln] = '\\0';
}
int main(){
    char *s="abcdefghijklmnopqrstuvwxyz";
    ln = strlen(s);
    char sr[ln+1];
    rev(s,ln,sr);
    printf("%s\n",sr);
}
[/PHP]
程序很简单,将字符串倒置,但是这个程序会丢掉第一个字符"a"。
如果把sr[ln]='\0'改成sr[ln+1]='\0'就没事了。但是我的sr的长度不是只有ln+1吗?sr[ln+1]为什么不越界?
发表于 2004-3-25 15:03:40 | 显示全部楼层
sr+=ln;

??0?ln??ln+1?????
 楼主| 发表于 2004-3-25 18:32:17 | 显示全部楼层
不对,sr是指向这个数组的第一个位置,如果加上ln,也就是26,那就成了sr[26]了,就成了最后一个位置,这里应该是用来存放结束字符NULL的。
发表于 2004-3-25 19:31:22 | 显示全部楼层
逻辑错误。把rev函数中这一句改成:

  1.     sr[ln+ 1] = '\0';
复制代码


顺便哆嗦一句,楼主的程序有一些问题,如:
[php]
    ln = strlen(s);
    char sr[ln+1];
[/php]
数组的大小是静态的,如果ln是由s串来动态确定大小,程序很容易出错。应该写成这样:
[php]
    int ln = strlen(s);
    char* sr = (char *)malloc(ln + 1);
[/php]
 楼主| 发表于 2004-3-26 17:45:51 | 显示全部楼层
thanks,能不能帮我解释一下我原来的问题。
我的数组不是只有ln+1个元素吗?为什么用sr[ln+1]来访问?这不是越界了吗?
另外,我的ln只有一次赋值,这时候它应该相当于一个常量,用
char sr[ln+1]
应该是固定分配内存的。这时候跟malloc有区别吗?
发表于 2004-3-26 19:17:45 | 显示全部楼层
晕?!!真是不知道怎么对你说,你自己好好看看这段代码:

  1. void rev(char* s, int ln, char* sr){
  2.     sr += ln-1;
  3.     for(;*s;s++,sr--) *sr=*s;
  4.     sr[ln] = '\0';
  5. }
复制代码

你的sr早就被改变了,你还能把它当作数组的首地址使用吗?
改成这样就很清楚啦:

  1. void rev(char* s, int ln, char* sr){
  2.         char *sp=sr;
  3.     sr += ln-1;
  4.     for(;*s;s++,sr--) *sr=*s;
  5.     sp[ln] = '\0';
  6. }
复制代码
发表于 2004-3-26 19:24:24 | 显示全部楼层
最初由 cozo 发表

另外,我的ln只有一次赋值,这时候它应该相当于一个常量,用
char sr[ln+1]
应该是固定分配内存的。这时候跟malloc有区别吗?

相当于常量并不等于是常量。你这个ln是随着strlen()函数的返回值改变的,如果你的字符串长度改变,ln的值也会改变。而常量在初始化后是不会被改变了。
 楼主| 发表于 2004-3-26 19:47:02 | 显示全部楼层
我不会在一个文件里两次调用这个赋值的。呵呵。
谢谢kj501,终于明白啦。
发表于 2004-3-26 20:03:13 | 显示全部楼层
感谢版主的热心回答,谢谢!~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表