1

我不习惯 C,因为我主要是一个 Java 人,对 C++ 有一些了解,所以如果这是一个微不足道的问题,请原谅我。我在网上搜索时似乎找不到答案。

我正在初始化一个字符数组...

char tcp[50];

这样我就可以连接一个 const char 和一个 char。在示例中,我看到一个简单的方法是创建空字符数组,然后使用...

strcat(x,y);

把它们粘在一起。

问题是,当它设置为“50”时打印出空白字符数组会给我一个结果:

X??|? 

当我将其更改为...

char tcp[100];

并打印它,它是空白的。为什么是这样?

4

5 回答 5

7

数组内容是未定义的,假设它是一个本地(自动)数组。

采用:

char tcp[50] = "";

或者:

char tcp[50] = {0};

或者:

char tcp[50];
tcp[0] = 0;

或者:

char tcp[50];
memset(tcp, 0, sizeof(tcp));

随你便。

于 2012-01-13T14:59:17.150 回答
1

在执行任何操作之前,始终为 null 终止您的 char 数组:

tcp[0] = '\0';
于 2012-01-13T14:59:39.210 回答
1

C 很乐意为您声明的数组分配空间,但它没有将其内容设置为 0。

因此,您正在打印的数组的内容是随机的(或者取决于内存的先前内容)

于 2012-01-13T14:59:56.107 回答
1

创建数组时,编译器将其放在内存中的某个位置,但不会对其进行初始化,因此程序启动时该内存中的任何内容都将是初始“字符串”。

创建数组后手动终止字符串,方法是使整个数组“归零”,或者只是将零作为第一个字符:

char tcp[50] = { '\0' };

或者

char tcp[50];
/* ... */
tcp[0] = '\0';
于 2012-01-13T15:01:41.353 回答
0

这里的不同之处在于,您实际上是在使用两个空数组,试图将它们合并到一个的内存空间中(不确定这对您是否有意义)。

首先,在 C 语言中,你必须用\0. 这在 Java 中是不公开或不可见的。此外,您基本上使用了两个未定义的字符串(因为没有设置值)。

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

char target[256];
const char source_a[] = "Hello";
const char source_b[] = "World!";

int void(main)
{
    target[0] = '\0'; // this essentially empties the string as we set the first entry to be the end. Depending on your language version of C, you might as well write "char target[256] = {'\0'};" above.
    strcat(target, source_a); // append the first string/char array
    strcat(target, " "); // append a const string literal
    strcat(target, source_b); // append the second string

    printf("%s\n", target);

    return 0;
}

重要提示:使用strcat()可以不保存,因为没有执行长度检查,并且除了 Java 之外,这些“字符串”具有固定长度(您在定义变量时设置的长度)。如果没有给出长度,但您在初始化时复制了一个字符串,则采用该长度(例如,长度为char test[] = "Hello!";7 个字符(由于终止\0))。

如果您想在字符串上使用更类似于 Java 的方法,请使用 C++ 和std::string类,它的执行与 Java 的字符串更相似。

于 2012-01-13T15:04:08.013 回答