首页 > 试题广场 >

请找出下面代码中的所有错误。说明:以下代码的功能是把一个字符

[不定项选择题]
请找出下面代码中的所有错误。说明:以下代码的功能是把一个字符串倒序,如“abcd”倒序后变为“dcba”。
1 #include "string.h"
2 int main() 
3 {
4    char *src = "hello,world";
5    char *dest = NULL;
6    int len = strlen(src);
7    dest = (char *)malloc(len);
8    char *d = dest;
9    char *s = src[len];
10   while (len-- != 0)
11      *d++ = *s--;
12   printf("%s", dest);
13   return 0;
14     
15}

  • 第7行要为'\0'分配一个空间
  • 第9行改成char * s = &src[len-1]
  • 第12行前要加上*d = '\0'
  • 第13行前不加free(dest),程序结束时也会释放空间
推荐

方法1:

int main() 
{
    char *src = "hello,world";
    int len = strlen(src);
    char *dest = (char *)malloc(len + 1); //要为\0分配一个空间
    char *d = dest;
    char *s = &src[len - 1]; //指向最后一个字符
    while ( len-- != 0 )
        *d++ = *s--;
    *d = 0; //尾部要加\0
    printf("%s\n", dest);
    free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
    return 0; 
}
方法2:
int main()
{
    char str[] = "hello,world";
    int len = strlen(str);
    char t;
    for (int i = 0; i < len; i++) 
    {
        t = str[i];
        str[i] = str[len - i - 1]; 
        str[len - i - 1] = t;       
    }
    printf("%s", str);
    return 0;
}


编辑于 2015-02-03 15:27:06 回复(16)
strlen其中不包括0的长度
发表于 2016-05-04 08:59:23 回复(0)
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')
发表于 2016-10-23 10:33:58 回复(0)
答案D是教科书式的调调
实际上,可以不显式调用free,main结束,内存都会释放,多余的操作。
发表于 2017-04-15 09:47:42 回复(12)
void Reverse(char* str,int from,int to){
    while(from < to){
         char t = str[from];
         str[from++] = str[to];
        str[to --] = t;
    }
}
可以使用上面方法简洁有效解决字符串翻转的问题。而且不局限于从哪里翻转到哪里。

发表于 2016-05-06 18:27:53 回复(2)
这题确实有问题,多问错误,你改了一处,另一处就能变对,不用改。
指针赋值是要干什么,src本来也不用了。
编辑于 2016-03-07 12:25:28 回复(2)
所以这d选项有什么b用
发表于 2022-03-31 17:28:23 回复(1)
C选项有错误,应该是*d = '\0'.这应该是题目的错误吧!
发表于 2015-08-18 09:59:56 回复(5)
字符串结束符为什么要人为给呢?  字符串初始化赋值的时候给结束符了吗  那怎么就有‘\0’呢
发表于 2021-01-09 10:42:12 回复(0)
我不释放空间直接关程序也释放了呀,怎么能算错误呢
发表于 2020-08-04 21:12:26 回复(0)
第11行也有错误,应该是*d++ = *s--;
发表于 2016-03-14 13:24:08 回复(6)
D不太合理,确实会造成内存泄漏,但是你main都结束了,整个程序就被清除了,最后还是得释放啊
发表于 2022-02-16 21:33:55 回复(0)
ABCD。
发表于 2021-07-20 12:54:23 回复(0)
想问一下,char *s=&src[len-1],题中没有定义数组,src是一个指针,怎么实现的从指针到数组啊
发表于 2018-04-30 10:50:50 回复(0)
修改B程序就可以运行,D修改内存管理更严谨,AC两个都不修改,结果仍正确
发表于 2017-06-18 12:20:47 回复(0)
这题是因为打印那里,如果不加空字符,dest就是个字符数组,而不是字符串,数组不可以这样直接打印出来,而要用for循环了。
发表于 2016-03-16 21:39:57 回复(1)
B 赋值错误,将src[len]字符值赋给了指针变量,应该是 char *s = src+len-1 
或者 char *s = &(src[len]);
C 终止符号,或者在dest申请好后就赋值 dest = ""
D 内存泄露
还有11行是地址赋值,这个没有意义,输出的时候就乱了,应该是*d++ = *s--
发表于 2015-04-10 08:57:22 回复(0)
main函数都结束了,还释放个啥内存呦
发表于 2019-01-18 08:59:50 回复(1)

strlen不会包含换行符

发表于 2018-08-02 11:55:32 回复(0)
intmain()
{
   char*src ="hello,world";
   intlen = strlen(src);
   char*dest = (char*)malloc(len +1);//要为\0分配一个空间
   char*d = dest;
   char*s = &src[len -1];//指向最后一个字符
   while( len-- !=0)
       *d++ = *s--;
   *d =0;//尾部要加\0
   printf("%s\n", dest);
   free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
   return0;
}

编辑于 2018-05-24 11:00:39 回复(0)
strlen()返回字符串长度,sizeof()返回分配内存的大小。而直接使用字符串给str最后有'\0' 所以A, 后面有输出dest的printf函数,需要'\0'结尾,所以需要多加一空间。B, s指向要取地址,不然只是单纯的值传递,无意义。至于len-1,src的结束符无作用。C, 后面额外加结束符不用说了。D,适当空间
发表于 2018-04-09 22:34:28 回复(0)