使用函数反转字符串并将整个字符串返回给主函数
Reverse the string using Function and returning the Whole string to main function
我已经编写了以下代码片段,但它不起作用。
谁能帮我?我哪里错了??
char *xstrrev(char *string)
{
int len=0,i=0;
char *reverse;
while(*string!='[=10=]')
{
len++;
string++;
}
len=len-1;
while(len>=0)
{
*reverse=string[len];
reverse++;
len--;
}
*reverse='[=10=]';
return reverse;
}
int main()
{
char name[10];
scanf("%s",name);
printf("%s",xstrrev(name));
return 0;
}
我无法在主函数中return整个字符串
问题开始(和结束)于
*reverse=string[len];
其中 reverse
未初始化。这会调用 undefined behavior.
您需要初始化 reverse
以使其指向 有效 内存位置,然后才能取消引用指针。
因为你期望从你的函数中_return_新的_string_并在调用者中使用它,你应该使用内存分配器函数,比如malloc()
来分配内存并在 malloc()
调用成功检查后使用 returned 指针初始化 reverse
。您还需要注意 free()
-ing 分配的内存,一旦您使用完它。
在那之后,根据您的逻辑,您正在做 reverse++;
,最后,您 returning reverse
,所以请考虑确切的值接受 return 教育。您正在 return 指向字符串 end 的指针,而不是指向字符串 start 的指针。您需要保留 reverse
和 return 实际开始的副本。
三个问题:
[1] reverse
未指向有效内存区域。
[2] returning reverse
将 return 字符串 reverse
的最后一个字节地址。所以需要存储 reverse
的开始和 return reverse
的开始。
[3] string
在计算长度时被完全解析,所以同样,原始字符串的开头需要保存并随后使用
char *xstrrev(char *string)
{
char *original_string = string;
int len=0,i=0;
//[1] char *reverse;
while(*string!='[=10=]')
{
len++;
string++;
}
//[3] till here "string" is completely parsed, so it points to past the end.
char *reverse = (char*)malloc(len + 1);
char *reverse_to_be_returned = reverse;
len=len-1;
while(len>=0)
{
//[3] *reverse=string[len];
*reverse = original_string[len];
reverse++;
len--;
}
*reverse='[=10=]';
//[2] return reverse;
return reverse_to_be_returned;
}
你需要分配space给char *reverse
指向。这可以用 malloc
or strdup
来完成。
基本上:
malloc()
allocates requested memory on the heap, and returns a void*
pointer in the end.
您还需要检查对 malloc()
的任何调用的 return 指针,因为如果发生错误,有时它可以 return NULL
。
为了安全起见,您还需要 free
最后请求内存。
此外,由于您是 return 指针,因此需要确保它指向字符串的开头,而不是结尾。
您的代码可以如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAMESTRLEN 10
char *xstrrev(char *string);
int
main(void) {
char name[NAMESTRLEN+1];
char *result;
printf("Enter string: ");
scanf("%10s", name);
result = xstrrev(name);
printf("Reversed string = %s\n", result);
free(result);
return 0;
}
char
*xstrrev(char *string) {
char *result;
size_t slen, count = 0;
int i;
slen = strlen(string);
result = malloc(slen+1); /* +1 for nullbyte */
if (!result) {
printf("Cannot allocate space for string.\n");
exit(EXIT_FAILURE);
}
for (i = slen-1; i >= 0; i--) {
result[count++] = string[i];
}
result[count] = '[=10=]';
return result;
}
我已经编写了以下代码片段,但它不起作用。 谁能帮我?我哪里错了??
char *xstrrev(char *string)
{
int len=0,i=0;
char *reverse;
while(*string!='[=10=]')
{
len++;
string++;
}
len=len-1;
while(len>=0)
{
*reverse=string[len];
reverse++;
len--;
}
*reverse='[=10=]';
return reverse;
}
int main()
{
char name[10];
scanf("%s",name);
printf("%s",xstrrev(name));
return 0;
}
我无法在主函数中return整个字符串
问题开始(和结束)于
*reverse=string[len];
其中 reverse
未初始化。这会调用 undefined behavior.
您需要初始化 reverse
以使其指向 有效 内存位置,然后才能取消引用指针。
因为你期望从你的函数中_return_新的_string_并在调用者中使用它,你应该使用内存分配器函数,比如malloc()
来分配内存并在 malloc()
调用成功检查后使用 returned 指针初始化 reverse
。您还需要注意 free()
-ing 分配的内存,一旦您使用完它。
在那之后,根据您的逻辑,您正在做 reverse++;
,最后,您 returning reverse
,所以请考虑确切的值接受 return 教育。您正在 return 指向字符串 end 的指针,而不是指向字符串 start 的指针。您需要保留 reverse
和 return 实际开始的副本。
三个问题:
[1] reverse
未指向有效内存区域。
[2] returning reverse
将 return 字符串 reverse
的最后一个字节地址。所以需要存储 reverse
的开始和 return reverse
的开始。
[3] string
在计算长度时被完全解析,所以同样,原始字符串的开头需要保存并随后使用
char *xstrrev(char *string)
{
char *original_string = string;
int len=0,i=0;
//[1] char *reverse;
while(*string!='[=10=]')
{
len++;
string++;
}
//[3] till here "string" is completely parsed, so it points to past the end.
char *reverse = (char*)malloc(len + 1);
char *reverse_to_be_returned = reverse;
len=len-1;
while(len>=0)
{
//[3] *reverse=string[len];
*reverse = original_string[len];
reverse++;
len--;
}
*reverse='[=10=]';
//[2] return reverse;
return reverse_to_be_returned;
}
你需要分配space给char *reverse
指向。这可以用 malloc
or strdup
来完成。
基本上:
malloc()
allocates requested memory on the heap, and returns avoid*
pointer in the end.
您还需要检查对 malloc()
的任何调用的 return 指针,因为如果发生错误,有时它可以 return NULL
。
为了安全起见,您还需要 free
最后请求内存。
此外,由于您是 return 指针,因此需要确保它指向字符串的开头,而不是结尾。
您的代码可以如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAMESTRLEN 10
char *xstrrev(char *string);
int
main(void) {
char name[NAMESTRLEN+1];
char *result;
printf("Enter string: ");
scanf("%10s", name);
result = xstrrev(name);
printf("Reversed string = %s\n", result);
free(result);
return 0;
}
char
*xstrrev(char *string) {
char *result;
size_t slen, count = 0;
int i;
slen = strlen(string);
result = malloc(slen+1); /* +1 for nullbyte */
if (!result) {
printf("Cannot allocate space for string.\n");
exit(EXIT_FAILURE);
}
for (i = slen-1; i >= 0; i--) {
result[count++] = string[i];
}
result[count] = '[=10=]';
return result;
}