字符串连接查询c ++

时间:2009-11-16 06:37:32

标签: c++ string

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream>

using namespace std;


char a[21]; // If this is put inside the function unter -> junk output
char* b="";

void unter()
    {
        char *new_str = "";


        strcpy(a, new_str);

        char str_temp[10]="";
        int chnum =0, neighbor1=3, neighbor2=5, mynode=4;

        sprintf(str_temp,"%d",chnum);

        b = strcat(a, str_temp);
        b = strcat(b, "_from");
        sprintf(str_temp,"%d",mynode);
        b = strcat(b, str_temp);
        b = strcat(b, "to");
        sprintf(str_temp,"%d",neighbor1);
        b = strcat(b, str_temp);


    }

int main()
{
    unter();
    cout << a;
    cout << b;
    std::cin.get();
}

这是我在C ++中的代码。我不确定字符数组'a'是如何与'b'具有相同的值。而且,当我宣布'a'

char a[21]; 
在内部函数unter()中,我得到了'b'的一些垃圾值(作为输出)。小心解释如何?

7 个答案:

答案 0 :(得分:3)

b = strcat(a, str_temp);

可能是导致你的问题的原因,因为strcat()的返回值是传递给它的第一个参数,因此你看到ab变得相等的原因,因为{该通话中{1}}已设置为b

答案 1 :(得分:3)

a是一个char数组,b是一个指向a的指针,因此在打印它们时,它们总是打印相同的东西。当您将a的声明移动到unter时,它会在unter返回时被销毁,留下b一个dnagling指针,因此在打印时会出现垃圾。

答案 2 :(得分:2)

strcat()返回连接操作的结果,所以

b = strcat(a, str_temp);

导致b指向数组a []。随后的strcat()操作实际上也是如此,因此最终结果是b指向[]。如果在unter()中声明一个[],它将具有该函数的局部作用域,结果是在退出对unter()的调用后,全局变量b将指向随机/未定义的内存内容。

值得注意的是,您正在做很多可以通过

轻松完成的工作。
sprintf(a, "%d_from%dto%d", chnum, mynode, neighbor1);

答案 3 :(得分:2)

您可以在一行中完成整个连接和sprintf。

char* b="";
void unter()
    {
        int chnum =0, neighbor1=3, neighbor2=5, mynode=4;
        char str_temp[21];
        sprintf(str_temp,"%d_from%dto%d", chnum, mynode, neighbor1);
        b = new char[strlen(str_temp)+1];
        b = strcpy(b, str_temp);
    }

有趣的是你必须记得在完成后删除b。另一个选择是直接使用a buffer和sprintf:

char a[21]; 
void unter()
    {
        int chnum =0, neighbor1=3, neighbor2=5, mynode=4;
        char str_temp[21];
        sprintf(a,"%d_from%dto%d", chnum, mynode, neighbor1);
    }

答案 4 :(得分:1)

除了提供的其他提示外,您还应注意

b = strcat(b, str_temp);

似乎对b不合适只是被定义为指向单字节存储的char指针(“”定义一个空字符串,即一个包含'0'的单个元素的字符数组)

因此,当strcat附加到b时,它会创建一个缓冲区溢出。

编辑:实际上我只是注意到b被指定为指向a,(感谢前面提到的那一行),这样就可以了,因为可能有空间......但是,需要两个变量没有意义。

也许你不明白的是,虽然strcat()返回一个指针,但这个返回不需要“消耗”,这只是一个方便,因为当我们链接命令时。换句话说,你可以简单地写:

strcat(a, str_temp);

不需要任何字符* b。

答案 5 :(得分:1)

在函数内部定义a时,变量a的内存在堆栈上分配。函数退出时会破坏此内存。指针b指向a的起始地址。现在,如果您尝试在函数外部访问b,它将指向已经被破坏并包含垃圾值的内存位置。基本上,b变成了悬空指针。

答案 6 :(得分:1)

如果在a函数中声明unter(),那么它仅限于该函数内部。尝试从函数外部打印b将打印垃圾,因为它指向已被销毁的a

这是一个典型的例子,说明为什么你总是要确保不要指向全局变量。