我试图理解指针并制作一个反向字符串函数。
code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *reverseString(char string[]){
int i;
int len = strlen(string);
char reversedString[len];
for (i = 0; i < len; i++){
reversedString[i] = string[(len - 1) - i];
}
printf("%s", reversedString); //print it out
return reversedString; //return pointer to first element of reversed string
}
int main (){
char string[6] = "kitten";
int i;
char *p = reverseString(string);
return (0);
}
我的目标是反转字符串“kitten”并打印反转的字符串。我期望输出“nettik”,但我得到“nettik���”。为什么我会得到这些奇怪的字符?
停止!首先,您犯了初学者在学习指针时经常犯的典型错误。当你写:
char *reverseString(char string[]) {
...
char reversedString[len];
return reversedString;
}
你正在返回一个指向它所在位置的指针was,不是:当您离开该函数时,内存实际上会被释放,因此不能保证您认为包含反转字符串的内存尚未被其他东西重用。这样,你的程序就会灾难性地失败。
但是,您在返回字符串之前打印了反转的字符串,所以这不是什么大问题yet。那么,问题出在你的字符串没有正确地以零结尾。
C语言中的字符串需要空间来存储它的最终结果'\0'
byte: char string[6] = "kitten";
太小,无法容纳以零结尾的字符串{ 'k', 'i', 't', 't', 'e', 'n', '\0' }
。同样,当你打电话时printf("%s", reversedString)
,您还没有正确终止字符串'\0'
, so printf
不断寻找字符串的末尾并打印出内存中的任何垃圾reversedString
已分配。
你应该试试:
- 让你的函数返回
void
,
- 分配
7
原始字符串的字节数,
- 分配
strlen(string) + 1
(这也是 7)个字节用于新字符串,并且
- 写一个
'\0'
反向循环旧字符串后到新字符串的末尾。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)