字符串逆序改错题(一),面试中经常遇到,本人已经遇到两次!!
题目:请找出下面代码的所有错误,说明:一下代码是把一个字符串倒序,如"abcd"倒序为"dcba",以下是引用的代码
1 #include "string.h" 2 main() 3 { 4 char* pSrc = "hello,world"; 5 char* pDest = NULL; 6 int iLen = strlen(pSrc); 7 pDest = (char*)malloc(iLen); 8 char* pD = pDest; 9 char* pS = pSrc[iLen]; 10 while (iLen-- != 0) 11 { 12 pD++ = pS--; 13 } 14 printf("%s", pDest); 15 return 0; 16 }
自己的回答,不对的请大家补充指正。
错误:第1行:" "包含的是自定义头文件 ,strlen函数包含头文件<string.h> ,malloc函数使用要包含头文件<stdlib.h> ,printf函数要包含头文件<stdio.h>
第2行:main 要有返回值类型 int
第7行:由于字符串是以'\0'结尾的,所以在申请内存空间要iLen+1
第9行:题目中是用数组里的元素给地址赋值,要改为pS=&[iLen -1] ,因为逆序不是从最后的'/0'开始,而是从'd'开始,一共有11个字符,'d'字符的下标为10
第12行:那是地址之间赋值,逆序要的是字符数组里的元素进行赋值,要解引用,*pD++=*pS--;
跳出while循环后,此时pD指向最后一个地址,因为时字符串,所以要加上'\0',要不然指向的垃圾数据。
此外,malloc申请的是堆区内存,用完之后要free()进行释放,要不然会导致内存泄漏。
改正后代码如下:
1 #include <string.h> 2 #include <stdlib.h> 3 #include <stdio.h> 4 5 int main() 6 { 7 char* pSrc = "hello,world"; 8 char* pDest = NULL; 9 int iLen = strlen(pSrc); 10 pDest = (char*)malloc(iLen+1); 11 char* pD = pDest; 12 char* pS = &pSrc[iLen-1]; 13 while (iLen-- != 0) 14 { 15 *pD++ = *pS--; 16 } 17 *pD = '\0'; 18 printf("%s", pDest); 19 free(pDest); 20 return 0; 21 }
执行后结果如下: