【问题标题】:Reversing the string in C [closed]在C中反转字符串[关闭]
【发布时间】:2013-02-25 05:15:06
【问题描述】:
#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() 分配的内存,因为我需要重新运行反转的字符串。

【问题讨论】:

  • 这是你的真实代码吗?它无法编译。
  • 请用问题陈述和几句话解释您的解决方法来改进您的问题。
  • @nm :是的,这是我的真实代码。它正在编译,但字符串没有以相反的顺序打印。
  • 你用的是什么编译器?代码不是有效的 C,它在两个地方缺少分号。

标签: c


【解决方案1】:

(1):l 中的第一个内存是\0,原因如下:

在你的循环之后

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

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

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

你返回return l; 并且在l 的第一个位置\0 是这样 所以在 printf 语句中使用%s

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:(读取cmets

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 

建议:你是否在不调用 free() 的情况下使用 l 并返回 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';

【讨论】:

  • @Angus 不正确。在发布问题之前,您应该足够努力。 ..如果您有任何疑问,请告诉我。
  • @Angus 没问题准备好再试一次我已经给出了足够的观点我认为你可以纠正你的代码。
  • 谢谢。您希望改进编码,而不是责备糟糕的编码。我将在下一篇文章中改进我的编码。
  • @Angus 是的,这没什么大不了的。我刚通过大学的 C-grad 考试。你只需要读一本书+解决每章后面给出的每个练习。它唯一的 7 天任务
  • @Angus 再次阅读我的答案,我对所有 cmets 进行了一些更改 See here is your code on codepad。你只犯了容易改进的错误。算法方面确实没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2015-05-24
相关资源
最近更新 更多