c - 在 C 中反转字符串

标签 c

<分区>

#include<stdio.h>
#include<string.h>
#include<malloc.h>
char *str_rev(char s[]){
 static char *st = NULL;
 static char *l;
 int i = 0,c = 0;
 st = malloc((strlen(s) * sizeof(*s))+1);
 *l = st;
 if(s == NULL){
  return "INVALID PARAMS";
 }
 for(i=0;s[i]!='\0';i++){
 ;
 }
 for(c=i;c >=0;c--){
  *l++ = s[c];
 }
 l = '\0';

 return st;
}
int main(){
 char a[]="Angus Declan R";
 printf("\n %s \n",str_rev(a));
 return 0;
}

如何释放在 func str_rev() 中使用 malloc() 分配的内存,因为我需要重新运行反转的字符串。

最佳答案

(1): l 中的第一个内存是 \0 由于以下原因,这就是什么都不打印的原因:

在你的循环之后

for(i=0;s[i]!='\0';i++){
 ;
 }

s[i] 变为 \0 并且您分配 c=i 并且在您分配 \0 之后的第二个循环中l 中的第一个点。

for(c=i;c >=0;c--){
  *l++ = s[c];  // you are assigning `\0` for first time
 }

你返回 return l; 并且在 l \0 的第一个位置是这样 所以在带有 %s

的 printf 语句中
printf("\n %s \n",str_rev(a));    

什么都不打印。

建议:

for(c=i-1;c >=0;c--){
     // ^ c should be i-1 initially 
  *l++ = s[c];
 }

(2):您至少在问题代码中有两个编译错误。你忘记了 ; 两个位置

 return "INVALID PARAMS"; 
                        ^ 

下一步

char a[]="Angus Declan R";
                         ^

第三个严重错误

您正在返回无效的内存地址!
你在做什么,在 st 分配内存,然后分配给 l,然后 free(st) 并返回 l:(阅读评论)

st = malloc((strlen(s) * sizeof(*s))+1);   // allocation 
l = st;          // assign to l

// code in between

free(st);    // st and l become invalid after free
return l;    // returning invalid memory 

建议您是否使用 l 并在不调用 free() 的情况下返回 st

(4):

这不是错误,但为什么会出现这个无用的循环?

while(c > 0){
  l--;
  c--;
 }

(5): 忘记了 l

前面的 *
for(c=i;c >=0;c--){
  *l++ = s[c];
 }
  l = '\0';
 ^ forgot *   it should be *l = '\0';

关于c - 在 C 中反转字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15314686/

相关文章:

c - 按位创建 64 位 float

c - 在 C 中使用 ffmpeg : system() or C api?

使用c语言更改终端目录

c - 使用 scanf 连续读取字符串和 int 时遇到问题

c - 将 stdout 和 stderr 重定向到分布式 shell 程序的套接字

c - 为什么跟踪器服务器不理解我的请求? (比特流协议(protocol))

C 重新分配以找到行尾,但没有得到整行?

c# - 解码 PEM (c#)

c - C中奇怪的整数比较

c - "calloc"内存分配失败