我现在对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;
}
当用户输入一个单词时,程序会在我存储它时成功将其打印出来但是当我调用反向功能时我没有返回任何内容。它在我的编辑器中说正在返回内存堆栈的地址,而不是我试图在我的函数中创建反向的数组的字符串。任何人都可以提供解释:(
答案 0 :(得分:0)
sizeof(word)
不正确。当word
数组传递给函数时,它将作为指向第一个char的指针传递,因此您将获取指针的大小(大概是4或8,在32位或64位计算机上)。通过打印尺寸确认。您需要使用strlen
来获取字符串的长度。
代码还有其他问题。例如,您不需要嵌套循环来反转字符串。而sizeof(word-1)甚至比sizeof(word)更糟糕。而i--
但比较i<=0
的循环注定要失败:i
会不断变得更负面。
答案 1 :(得分:0)
您的reverse
功能存在多个问题。 C与Java非常不同。它更简单,功能更少。
sizeof
将返回错误的值。reverse
是两次使用的标识符(作为函数名和局部变量)。您可能寻找的是标题strlen
中可用的函数string.h
。它会告诉你字符串的长度。如果你想以自己的方式解决它,你将需要知道如何为字符串分配内存(以及如何释放它)。
如果你想要一个反转字符串的函数,你可以直接在参数word
上操作。它已经在reverse
函数之外分配,因此它不会消失。
如果你只想向后输出字符串而不反转它,你也可以从字符串末尾的char之后输出char,从strlen(word) - 1
迭代到0
开始。
答案 2 :(得分:-1)
编辑:更改了我的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;
}