我是C语言的新手。我需要连接char数组和char。在java中我们可以使用'+'操作但在C中是不允许的。 Strcat和strcpy也不适合我。我怎样才能做到这一点?我的代码如下
void myFunc(char prefix[], struct Tree *root) {
char tempPrefix[30];
strcpy(tempPrefix, prefix);
char label = root->label;
//I want to concat tempPrefix and label
我的问题与concatenate char array in C不同,因为它将char数组与另一个连接,但我的是一个带char的char数组
答案 0 :(得分:1)
真的很简单。主要担心的是tempPrefix
应该有足够的空间用于前缀+原始字符。由于C字符串必须以空值终止,因此您的函数不应复制超过28个字符的前缀。它是30(缓冲区的大小) - 1(根标签字符)-1(终止空字符)。幸运的是,标准库具有strncpy
:
size_t const buffer_size = sizeof tempPrefix; // Only because tempPrefix is declared an array of characters in scope.
strncpy(tempPrefix, prefix, buffer_size - 3);
tempPrefix[buffer_size - 2] = root->label;
tempPrefix[buffer_size - 1] = '\0';
同样值得的是不要在函数调用中对缓冲区大小进行硬编码,这样就可以用最小的更改来增加它的大小。
如果您的缓冲区不合适,则需要更多的工作量。该方法与以前几乎完全相同,但需要调用strchr
才能完成图片。
size_t const buffer_size = sizeof tempPrefix; // Only because tempPrefix is declared an array of characters in scope.
strncpy(tempPrefix, prefix, buffer_size - 3);
tempPrefix[buffer_size - 2] = tempPrefix[buffer_size - 1] = '\0';
*strchr(tempPrefix, '\0') = root->label;
我们再次复制不超过28个字符。但是用NUL字节显式填充结尾。现在,由于strncpy
填充缓冲区的NUL字节最多为count
,以防复制的字符串较短,实际上复制前缀之后的所有内容现在都是\0
。这就是为什么我立即尊重strchr
的结果,保证指向一个有效的字符。确切地说,第一个自由空间。
答案 1 :(得分:0)
strXXX()
函数系列主要在字符串上运行(搜索相关的字符串除外),因此您将无法直接使用库函数。
您可以找到现有空终止符的位置,将其替换为要连接的char
值,然后添加空终止符。但是,您需要确保您有足够的空间让源保存连接的字符串。
像这样(未经测试)
#define SIZ 30
//function
char tempPrefix[SIZ] = {0}; //initialize
strcpy(tempPrefix, prefix); //copy the string
char label = root->label; //take the char value
if (strlen(tempPrefix) < (SIZ -1)) //Check: Do we have room left?
{
int res = strchr(tempPrefix, '\0'); // find the current null
tempPrefix[res] = label; //replace with the value
tempPrefix[res + 1] = '\0'; //add a null to next index
}