【问题标题】:Unable to concatenate two char * pointer value?无法连接两个 char * 指针值?
【发布时间】:2016-01-10 07:54:49
【问题描述】:

我想问一个问题,如果我们有两个字符串,但它们应该在给定的代码中

#include<stdio.h>
#include<stdlib.h>
#include <string.h>

char *getln()
{
    char *line = NULL, *tmp = NULL;
    size_t size = 0, index = 0;
    int ch = EOF;

    while (ch) {
        ch = getc(stdin);
        if (ch == EOF || ch == '\n')
            ch = 0;
        if (size <= index) {
            size += index;
            tmp = realloc(line, size);
            if (!tmp) {
                free(line);
                line = NULL;
                break;
            }
            line = tmp;
        }
        line[index++] = ch;
    }

    return line;
}
char * combine(char *a,char *buffer){
   int stop_var;
   int newSize = strlen(a)  + strlen(buffer) + 1; 
   char * newBuffer = (char *)malloc(newSize);
   strcpy(newBuffer,a);
   strcat(newBuffer,buffer); // or strncat
   //printf("Final String %s",newBuffer);
   free(a);
   a = newBuffer;
   return newBuffer;
}
char * fun(char *str)
{
    char *str1;
    str1=getln();
    str=combine(str,str1);
    return str;
}
int main(void)
{
    char *str;
    str= getln();
    printf("Initial String %s \n",str);
    str=fun(str);
    printf("Final String %s \n",str);
}

此代码工作正常,但字符串 char *str="Fixed value" 已修复会导致运行时错误

int main(void)
{
    char *str;
    str= "Fixed Value";
    printf("Initial String %s \n",str);
    str=fun(str);
    printf("Final String %s \n",str);
} 

所以,我想知道是否有其他方法可以运行上述字符串已修复的情况。我知道“我们如何才能在同一个字符指针中实现最终值”。

请阅读注意事项: 有很多与这个问题相关的问题我已经尝试了所有的解决方案。 我查看了以下解决方案

  1. concatenate-two-char-arrays-into-single-char-array-using-pointers

  2. concatenate-two-char-arrays

  3. how-to-concatenate-pointer-arrays

  4. concatenate-char-array-in-c

  5. concatenate-two-arrays-using-void-pointer-c

我在互联网上搜索了更多解决方案,但没有解决方案符合我的条件。所有这些解决方案都使用第三个变量并显示其值。我想要同一个变量中的值。即使我们创建任何额外的变量,它的值最终也应该分配给char *str

请向我提供仅用 c 语言执行此操作的任何建议。

The given question 与我的问题不同,因为在那个问题中,他们检查了我的情况下字符串文字 bu 的行为,我希望将连接值分配给变量 str。它的解决方案更改了指向数组的指针,但我无法更改,因为它的值在我的工作中使用了许多函数。

【问题讨论】:

  • strcat() 实际上有什么问题?
  • @NathanOliver 为什么这是重复的?这与修改字符串文字没有直接关系(只是间接地,通过free())。
  • 而且您已经广泛使用 realloc,那么为什么还要使用 combine 呢?只需获取您的输入字符串,重新分配第一个足够大以适合两者,然后将 strcat 放入其中...
  • 如果我从组合函数中删除了“free()”,那么代码会引发分段错误。如果有任何其他直接或间接修改文字的方式,请建议我。
  • @KrishnasaiGudavalli 您不能修改字符串文字。没有办法做到这一点。如果你想要一些可写的东西,你可以创建一个数组并用字符串初始化它。

标签: c arrays string pointers


【解决方案1】:

我建议成对分配/解除分配功能:

char * combine_allocate(const char *a, const char *b) {
    char* result = malloc(...)
    combine ...
    return result;
}

void combine_deallocate(char* p) { free(p); }

有这个:

char* a = initial_allocate();
char* b = initial_allocate();
char* c = combine_allocate(a, b);
initial_deallocate(a);
initial_deallocate(b);
// ... use c
combine_deallocate(c)

对于字符串文字,您可以省略(并且应该)initial_allocate/initial_deallocate。 它可能有点过于冗长,但面向对象的 C 没有做任何其他事情(具有更好的函数名称)。

【讨论】:

  • 这不是通用解决方案,因为它依赖于编译器,因此不适用于较旧的编译器版本。
  • @KrishnasaiGudavalli 这也是老式的。
  • 请给我发送可以满足我的情况的工作代码来更改字符串文字。
  • @KrishnasaiGudavalli - 不
  • @KrishnasaiGudavalli 编写您自己的代码。 Stack Overflow 不是代码编写服务。询问“你能给我发送代码吗”是解决问题的最简单方法。
【解决方案2】:

您的函数combine() 在其第一个参数上调用free()。在您的 fun() 调用中,它是从 fun() 传递的,它指向代码中的字符串文字。

您不能在字符串文字上调用free(),这是未定义的行为。我建议你重构你的代码,使combine() 不再在它的第一个参数上调用free()。释放内存应该是调用者的责任。

【讨论】:

  • 好的,如果我考虑你的情况,那么对于固定字符串它也不起作用。感谢您的宝贵建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 2013-05-15
相关资源
最近更新 更多