我正在尝试编写一个反转字符串的普通采访问题。
这是我的代码:
#include <string.h>
char* rev( char* str)
{
int i,j,l;
l = strlen(str);
for(i=0,j=l-1; i<l/2 ; i++, j--)
{
str[i] = (str[i] + str[j]);
str[j] = str[i] - str[j];
str[j] = str[i] - str[j];
}
return str;
}
int main()
{
char *str = " hello";
printf("\nthe reverse is %s ...", rev(str));
return 1;
}
基本上,这给出了分段错误。
我有以下问题:
我出现分段错误,可能是因为字符加起来没有在ascii中定义,因此我无法将它们存储回字符,我正在使用www.codepad.org [我想知道它是否仅支持ascii !!]。我的理解正确吗,或者还有其他东西。
对于相同的平台,我该如何解决该问题[我的意思是在适当位置交换codepad.org]
在这里,我必须使用其他整数l来计算长度。因此,通过交换就可以节省单个字符空间..我正在使用额外的int !!! ..只是打动了inteviewer :) ...这种方法值得值得!
这是针对那些对编写单元测试/ API测试感兴趣的人的。我希望有一个健壮的实现,以便可能的测试用例。我认为,如果面试官提出这样一个简单的问题,那么他肯定会想要一些非常强大的实施和测试用例。我很少想到:
传递空字符串,传递整数
字符串传递整数数组代替
字符数组。
很长的弦
单个字符字符串特殊字符的字符串。
任何建议/建议都会有所帮助。
最佳答案
从哪儿开始...
好的,首先您应该知道例程会在原地反转一个字符串,换句话说,就是对原始缓冲区进行了更改。
这意味着你可以做
int main()
{
char str[] = "hello";
rev(str);
printf("\nthe reverse is %s ...", str);
return 0;
}
并且该字符串将被反转。
另一种选择是创建一个新字符串,该字符串是原始字符串的反向副本。算法有些不同,您也应该能够做到这一点。
下一点:
str[i] = (str[i] + str[j]);
str[j] = str[i] - str[j];
str[j] = str[i] - str[j];
被打破。它应该是
str[i] = str[i] + str[j];
str[j] = str[i] - str[j];
str[i] = str[i] - str[j];
但是,正如〜mathepic所说,您应该改为这样做:
temp = str[i];
str[i] = str[j];
str[j] = temp;
另外:键盘使调试代码变得困难。在自己的计算机上安装编译器和调试器(例如gcc和gdb)。
字符加起来没有在ascii中定义,因此我无法将它们存储回字符,我正在使用www.codepad.org [我想知道它是否仅支持ascii !!]。我的理解正确吗,或者还有其他东西。
在大多数C实现中(无论如何都在32位PC上运行),
char
是8位整数。 int
是32位整数。当您加上或减去两个char
且结果超过8位时,它将“环绕”到其他某个值,但是此过程是可逆的。例如,255 + 1给出0,但0-1 =255。(仅作为示例)。这意味着“我不能将它们存储为字符”不是这里的问题。
我想要一个稳健的实施
您想证明自己已经考虑了不同设计选择的成本和收益。如果您的例程提供了NULL,则最好引起分段错误,因为这会很快提醒程序员代码中的错误。
传递空字符串
您必须确保您的代码可以在这种情况下工作。
传递整数
传递整数数组
您不能将整数或
int []
传递给期望char *
的函数。在C语言中,您无法确定char *
确实是字符串还是其他。单字符字符串
确保您的例程适用于单个char字符串,也适用于具有奇数和偶数个字符的两个字符串。
一串特殊字符
C中没有特殊的
char
(根据约定,空终止符'\ 0'除外)。但是,必须考虑multi- char
序列(反转UTF-8字符串与反转常规字符串不同)。但是,如果问题未明确说明,我认为您不必为此担心。最后三点:
在
main()
中,return 1;
通常表示您的程序失败。 return 0;
更常见,但return EXIT_SUCCESS;
最佳,尽管您可能需要#include <stdlib.h>
。考虑使用更具描述性的变量名。
考虑制作一个类似于
strnrev()
和类似函数的strncpy()
函数,如果在该函数中找不到空终止符,则该函数将不会超出n
字符。关于c - 健壮的字符串反向,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1698143/