无法连接两个char *指针值?

时间:2015-10-12 18:30:30

标签: c arrays string pointers

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

#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);
} 

所以,我想知道是否有其他方法来运行上面修复字符串的情况。我知道&#34;我们怎样才能在同一个字符指针中实现最终值&#34;。

请阅读注意: 有很多与此问题相关的问题我尝试了所有解决方案。 我看了下面的解决方案

  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

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

    请以c语言向我提出任何建议。

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

2 个答案:

答案 0 :(得分:2)

您的函数{=MAX(IF(AND(M21:M28=1,L21:L28="hao"),N21:N28))} Name No Value hao 1 10 hao 1 11 rui 2 12 rui 1 213 alvin 2 14 alvin 1 99915 hao 1 916 hao 3 9917 在其第一个参数上调用combine()。在free()调用中,该调用从fun()传递,指向代码中的字符串文字。

你不能在字符串文字上调用fun(),这是未定义的行为。我建议您重新构建代码,以便free()不再在其第一个参数上调用combine()。释放记忆应该是来电者的责任。

答案 1 :(得分:0)

我建议使用一对分配/释放功能:

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不会做任何其他事情(具有更好的函数名称)。