首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Realloc调整字符的大小**

使用Realloc调整字符的大小**
EN

Stack Overflow用户
提问于 2015-05-15 02:48:01
回答 1查看 868关注 0票数 1
代码语言:javascript
复制
typedef struct element element;
struct element{
    dado_t str;
    elemento* preview;
    elemento* next;
};

typedef struct lista2 lista2;
struct lista2{
    elemento* primeiro;
    elemento* ultimo;
    elemento* corrente;
};


void caller(lista2* l){
    char *s = l->corrente->str;
    char *s2 = l->corrente->next->str;
    my_func(&s, &s2);
}

void my_func(char **s, char**s2){
    size_t len = strlen(*s);
    size_t len2 = strlen(*s2);
    char *w = *s;
    char *tmp = realloc(w, len + len2 + 1); //PROBLEM HERE
    if(tmp != NULL)
       *s = tmp;
    else
        *s = NULL;
    strcat(*s, *s2);
}  

当我运行我的代码(在realloc()之前):

  • 带内存附加的*w = "I Like Coffe"0x605050
  • 带内存附加的*s = "I Like Coffe"0x605050
  • 带内存附加的l->corrente->str = "I Like Coffe"0x605050

目前为止一切都很好。

现在状态realloc之后(在赋值*s = tmp)之前):

  • 带内存附加的*w = ""0x605050
  • 带内存附加的*s = ""0x605050
  • 带内存附加的l->corrente->str = ""0x605050

还好对吧?现在我在*s = tmp之后得到的是:

  • 带内存附加的*w = ""0x605050
  • 内存附加的*s = "I Like Coffe"0x605160已更改
  • 带内存附加的l->corrente->str = ""0x605050

我需要的是:

1)改变l->corrente->str值的my_func()值;

2)或者以某种方式,在strcat之后将*s值更改为新值。保持l->corrente->str不变。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-15 03:17:42

如果我正确地理解了您,并且您希望在保持*sl->corrente->str不变的同时创建一个连接的值,那么在保持两个输入字符串不变的同时,让my_func返回一个指向新级联字符串的指针将更有意义。如果我不明白你想做什么,请留下评论。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *my_func(char *s, char*s2);

int main (void) {

    char *a = strdup ("I like coffee.");
    char *b = strdup ("I like tea.");

    char *c = my_func (a, b);

    printf ("\n a: %s\n b: %s\n c: %s\n\n", a, b, c);

    return 0;
}

char *my_func(char *s, char*s2)
{
    size_t len = strlen(s);
    size_t len2 = strlen(s2);
    char *w = strdup (s);

    char *tmp = realloc(w, len + len2 + 1); //PROBLEM HERE

    if(!tmp) {
        fprintf (stderr, "%s() error: realloc failed.\n", __func__);
        return NULL;
    }

    w = tmp;
    strcat(w, s2);

    return w;
}

输出

代码语言:javascript
复制
$ ./bin/realloc_post

 a: I like coffee.
 b: I like tea.
 c: I like coffee.I like tea.

保空*s*s2中的级联

这个my_func的实现没有返回指针,而是保持为void,并接受ss2,保持s不变,但在s2中连接"ss2"。如果我再次误解了,请告诉我。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void my_func(char **s, char **s2);

int main (void) {

    char *a = strdup ("I like coffee.");
    char *b = strdup ("I like tea.");

    my_func (&a, &b);

    printf ("\n a: %s\n b: %s\n\n", a, b);

    free (a);
    free (b);

    return 0;
}

void my_func(char **s, char **s2)
{
    size_t len = strlen(*s);
    size_t len2 = strlen(*s2);
    char *w = strdup (*s);
    char *p = *s2;          /* save start address to free */

    char *tmp = realloc(w, len + len2 + 1);

    if(!tmp) {
        fprintf (stderr, "%s() error: realloc failed.\n", __func__);
        return;
    }

    strcat(tmp, *s2);
    *s2 = tmp;
    free (p);
}

输出

代码语言:javascript
复制
$ ./bin/realloc_post

 a: I like coffee.
 b: I like coffee.I like tea.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30250731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档