我不习惯C,因为我主要是一个Java人,对C ++有一定的了解,所以如果这是一个微不足道的问题,请原谅我。我在网上搜索时似乎无法找到答案。
我正在初始化一个char数组......
char tcp[50];
这样我就可以连接一个const char和一个char。在示例中,我看到一种简单的方法是通过创建空char数组然后使用...
strcat(x,y);
将它们粘在一起。
问题是,当设置为“50”时打印出空白字符数组会给我一个结果:
X??|?
当我将其更改为...时
char tcp[100];
打印出来,它的空白。这是为什么?
答案 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的字符串执行更相似。