项目场景:
学习在Linux环境下的C语言编程,利用GDB打Breakpoint,逐步调试Bug
问题描述
尝试将一个字符串倒转后输出,发现执行文件并没有正常的将倒转后的字符串输出。
源代码:
#include <stdio.h>int main(void)
{int i;char str[6] = "hello";char reverse_str[6] = "";printf("%s\n", str);for (i = 0; i < 5; i++)reverse_str[5-i] = str[i];printf("%s\n", reverse_str);return 0;
}
如下图所示,在Terminal中,reverse_str函数并没有如同我们预期的正常输出“olleh”。
原因分析:
在C语言的编译中, char
型通过在字符串末尾加'\0'
的方式,描述不定长度的字符串。我们期望的是输出reverse_str
这个数组变量,所以我们在GDB中跟踪这个变量的内容变化。结果发现循环结束后,如图所示,reverse_str数组中的内容是,\000\olleh
,即倒转后的内容,不仅将hello
倒转了而且,将字符串末尾'\0'
也倒转了,并放置在了reverse_str[0]
位置。导致了本应该放置在数组末尾的'\0'
,被挤出了数组。C语言编译器无法正确读取字符串,所以输出错误。
解决方案:
解决方案很简单,源代码的问题在于字符串倒转之后每一个元素在数组中放置的位置不正确,只要将每个倒转后的元素移动一位就可以解决这个问题,空出reverse_str[6]
最后一个元素位置,就可以让C语言编译器正确的读取字符串,并且进行输出。
解决后的源代码:
#include <stdio.h>int main(void)
{int i;char str[6] = "hello";char reverse_str[6] = "";printf("%s\n", str);for (i = 0; i < 5; i++)if (str[i] != '\0')reverse_str[5-i-1] = str[i];printf("%s\n", reverse_str);return 0;
}
最后,倒转后的字符串正确输出。