连接char数组和char

时间:2017-04-18 04:47:41

标签: c arrays string concatenation

我是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数组

2 个答案:

答案 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
}