C经典面试题,下面的代码的目的是使字符串倒序,如“abcd”倒序后变为"dcba",请找出错误,并改正

本文详细解读了一道常见的C语言面试题,即如何将字符串倒序。通过对比原始代码与修正后的代码,深入分析了C语言中字符串操作、内存分配与释放的正确实践,旨在帮助读者巩固基本功并培养良好的编程习惯。
最近公司不忙,便翻看了很多公司以往的面试题,发现这道题出现的次数比较多,主要是考察应聘者的基本功及良好的代码习惯,总结出来希望和大家温习一下C基础。
题目要求:以下代码的目的是把一个字符串倒序,如“abcd”倒序后变为“dcba”,请找出所有错误,并改正

--------------------------以下是题目给出的函数-----------------------------------
#include"string.h"
main()    
{
     char*src="hello,world";
     char* dest=NULL;
     int len=strlen(src);
     dest=(char*)malloc(len);
     char* d=dest;
     char* s=src[len];
     while(len--!=0)
     d++=s--;
     printf("%s",dest);
     return 0;    
}  


----------------------------以下是改正后的函数-----------------------------------------
#include <string.h>
#include <stdlib.h> //malloc的头文件为stdlib.h
int main()          //因为函数最后有return 0;所以应该加上函数返回值类型
{
	char* src = "hello,world";
	int len = strlen(src);
	char* dest = (char*)malloc(len+1);//多分配一个空间用来存储字符串结束标志'\0'
	{
             perror("malloc"); //malloc出错时,报错退出
             exit(EXIT_FAILURE);
        }
        char* d = dest; 
	char
以下是几种不同的实现方式,可将输入字符串反序存放,在`main`函数中实现字符串输入和输出。 ### 方法一 ```c #include <stdio.h> #include <string.h> void inverse(char str[]) { char t; int i, j; for (i = 0, j = strlen(str); i < j / 2; i++, j--) { t = str[i]; str[i] = str[j - 1]; str[j - 1] = t; } } int main() { char str[100]; printf("input string:"); scanf("%s", str); inverse(str); printf("inverse string:%s\n", str); return 0; } ``` 此方法定义了`inverse`函数,利用两个指针`i`和`j`分别指向字符串的首尾,交换对应位置的字符,直到`i`大于等于`j/2`。在`main`函数中,使用`scanf`获取用户输入的字符串,调用`inverse`函数进行反序,最后输出反序后的字符串[^1]。 ### 方法二 ```c #include <stdio.h> #include <string.h> void fanxu(char a[]) { int i, k, q, p; p = strlen(a); for (i = 0, k = p - 1; i < k; i++, k--) { q = a[i]; a[i] = a[k]; a[k] = q; } } int main() { char arr[11]; printf("输入字符串(只记录前十个字符):"); fgets(arr, 11, stdin); fanxu(arr); puts(arr); return 0; } ``` 该方法定义了`fanxu`函数,同样通过两个指针`i`和`k`分别从字符串首尾向中间移动,交换对应位置的字符。在`main`函数中,使用`fgets`获取用户输入的字符串,调用`fanxu`函数进行反序,最后使用`puts`输出反序后的字符串[^2]。 ### 方法三 ```c #include <stdio.h> #include <string.h> void stringInvert(char *str) { int i, j, a; char temp[1024]; a = strlen(str); for (i = 0, j = a; i < a; i++, j--) { temp[j - 1] = str[i]; } temp[a] = '\0'; puts(temp); } int main() { char str[1024]; printf("str[1024]="); gets(str); stringInvert(str); return 0; } ``` 此方法定义了`stringInvert`函数,将原字符串的字符从后往前依次存放到临时数组`temp`中,最后输出临时数组。在`main`函数中,使用`gets`获取用户输入的字符串,调用`stringInvert`函数进行反序输出[^3]。 ### 方法四 ```c #include <stdio.h> #include <windows.h> #include <string.h> void reverse(char arr[], int sz) { int i = 0; char tmp = ' '; for (i = 0; i < sz / 2; i++) { tmp = arr[i]; arr[i] = arr[sz - i - 1]; arr[sz - i - 1] = tmp; } } int main() { char c[20] = {0}; gets(c); int sz = strlen(c); reverse(c, sz); puts(c); system("pause"); return 0; } ``` 该方法定义了`reverse`函数,通过交换字符串首尾对称位置的字符实现反序。在`main`函数中,使用`gets`获取用户输入的字符串,计算字符串长度,调用`reverse`函数进行反序,最后输出反序后的字符串[^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值