字符x [50]和字符x [100]输出

时间:2012-01-13 14:56:57

标签: c char strcat

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

我正在初始化一个char数组......

char tcp[50];

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

strcat(x,y);

将它们粘在一起。

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

X??|? 

当我将其更改为...时

char tcp[100];

打印出来,它的空白。这是为什么?

5 个答案:

答案 0 :(得分:7)

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

使用:

char tcp[50] = "";

或者:

char tcp[50] = {0};

或者:

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

或者:

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

如你所愿。

答案 1 :(得分:1)

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

tcp[0] = '\0';

答案 2 :(得分:1)

C愉快地为您声明的数组分配空间,但它不会将其内容设置为0.

因此,您要打印的数组的内容是随机的(或者更确切地说取决于以前的内存内容)

答案 3 :(得分:1)

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

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

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

或者

char tcp[50];
/* ... */
tcp[0] = '\0';

答案 4 :(得分: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的字符串执行更相似。