c - 反转没有两个循环的字符串?
问题描述
我想出了以下基本项来反转 C 中的字符串:
void reverse(char in[], char out[]) {
int string_length = 0;
for(int i=0; in[i] != '\0'; i++) {
string_length += 1;
}
for(int i=0; i < string_length ; i++) {
out[string_length-i] = in[i];
}
out[string_length+1] = '\0';
}
有没有办法在一个for
循环中做到这一点,或者是否有必要首先使用一个for
长度来获取字符串长度,然后再做一个来反转它?是否有其他方法来做 a reverse
,或者这是基本的方法?
解决方案
假设您不能使用函数来获取字符串长度并且您想保留第二个循环,恐怕这是最短的方法。
不过作为旁注:此代码不是很安全,因为for(int i=0; in[i] != '\0'; i++)
您没有考虑传递给参数的参数in
不是有效的C 字符串\0
的情况,其中数组的所有元素中都没有一个,in
并且 this代码最终会在第一次显示缓冲区过度读取for loop
时,它将读取超出in
边界,并在第二次显示缓冲区溢出for loop
,您可以在out
. 在这样的函数中,您应该向调用者询问两个数组的长度,in
并在访问它们时out
将其用作最大索引。
正如 Rishikesh Raje 在评论中指出的那样:您还应该将第二个 for 循环中的退出条件从i <= string_length
to更改为,因为当它将通过负索引访问时,i < string_length
它将生成另一个缓冲区过度读取。i == string_length
out
推荐阅读
- python-3.x - 即使直接从 Chrome 检查中复制,XPath 也不起作用
- go - 为什么这个版本标签会导致错误?
- curl - 如何生成“com.ibm.cloud.iam.Identity.prod”cookie?
- winapi - Win API 比较 2 个目录
- powershell - 对于每个循环过滤器 - 类似电子邮件地址
- asp.net - Azure Web 应用,自定义状态代码说明不起作用
- c - 我无法完美地完成这个循环
- android - Crashlytics 报告上传因 java.lang.OutOfMemoryError 而崩溃
- c# - 请为此 CountNumbers 算法建议不同的方法
- matlab - Matlab 编辑器变得非常慢,多项式方程具有“组合”(大量)项