[英]Function that prints reverse of a string/char array in C
我现在对C语言还很陌生,我正在尝试一些实践以帮助我理解C的工作原理。 我唯一精通的其他语言是Java。 这是我的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char * reverse(char word[]);
const char * reverse(char word[]) {
char reverse[sizeof(word)];
int i, j;
for (i = sizeof(word - 1); i <= 0; i--) {
for (j = 0; j > sizeof(word - 1); j++) {
reverse[i] = word[j];
}
}
return reverse;
}
int main() {
char word[100];
printf("Enter a word: ");
scanf("%s", word);
printf("%s backwards is %s\n", word, reverse(word));
return 0;
}
当用户输入单词时,程序会在我存储单词时成功打印出来,但是当我调用反向函数时,它不会返回任何内容。 它说在我的编辑器中,将返回内存堆栈的地址,而不是返回我试图在函数中创建的数组的字符串。 任何人都可以提供解释:
sizeof(word)
不正确。 当word
数组传递给函数时,它作为指向第一个字符的指针传递,因此您要使用指针的大小(在32位或64位计算机上大概为4或8)。 通过打印出尺寸确认。 您需要使用strlen
来获取字符串的长度。
代码还有其他问题。 例如,您不需要嵌套循环即可反转字符串。 而且sizeof(word-1)甚至比sizeof(word)还差。 而一个循环,它i--
但相比较i<=0
注定: i
会不断得到较为不利。
reverse
功能存在多个问题。 C与Java有很大的不同。 它简单得多,功能较少。
sizeof
将返回错误的值。 reverse
是使用两次的标识符(作为函数名和局部变量)。 您可能要寻找的是标头string.h
可用的strlen
函数。 它会告诉您字符串的长度。 如果要以自己的方式解决它,则需要知道如何为字符串分配内存(以及如何释放它)。
如果您想要一个反转字符串的函数,则可以直接对参数word
。 它已经在reverse
函数外部分配,因此它不会消失。
如果您只想向后输出字符串而不真正反转它,则还可以从字符串的末尾开始,在char之后输出char,以从strlen(word) - 1
到0
迭代开始。
编辑:更改了我的reverse()
函数,以避免指针算术并允许word
重用。
const
值; 无法将返回值分配给它,所以const
没有任何意义。 注意:由于C和C ++类型系统之间的差异,如果希望代码也可以编译为C ++, 则应将字符串返回为const char *
。 malloc()
在堆上分配它,否则不能返回函数局部变量。 因此,我们需要在main()
创建它,并将其作为参数传递。 sizeof
不起作用。 char
或数组的指针必须以字符串终止字符\\0
结尾。 %99s
而不是普通%s
字符串终止符\\0
留一个空格),否则容易造成缓冲区溢出。 #include <stdio.h> // size_t, scanf(), printf()
#include <string.h> // strlen()
// 1. // 2. // 3. // 4.
char *reverse(char *word, char *reversed_word, size_t size);
char *reverse(char *word, char *reversed_word, size_t size)
{
size_t index = 0;
reversed_word[size] = '\0'; // 5.
while (size-- > index) {
const char temp = word[index];
reversed_word[index++] = word[size];
reversed_word[size] = temp;
}
return reversed_word;
}
int main() {
char word[100];
size_t size = 0;
printf("Enter a word: ");
scanf("%99s", word); // 6.
size = strlen(word);
printf("%s backwards is %s\n", word, reverse(word, word, size));
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.