C中strcat和strncat函数的另一种替代方法是什么?

C中strcat和strncat函数的另一种替代方法是什么?,c,string,character,strcat,C,String,Character,Strcat,这是代码的特定部分,我在使用strcat()和strncat()函数连接两个字符串时遇到了问题 strcat()函数声明为char*strcat(char*dest,const char*src)和strncat()为char*strncat(char*dest,const char*src,size\t n),但是当第二个参数是字符串中的单个字符时,这两个函数都会出现问题,即,它不会以'\0'结尾。我需要将a字符连接到字符串 那么,除了这两个功能之外,还有其他的选择吗?或者,有没有办法让这两个

这是代码的特定部分,我在使用
strcat()
strncat()
函数连接两个字符串时遇到了问题

strcat()
函数声明为
char*strcat(char*dest,const char*src)
strncat()
char*strncat(char*dest,const char*src,size\t n)
,但是当第二个参数是字符串中的单个字符时,这两个函数都会出现问题,即,它不会以
'\0'
结尾。我需要将a字符连接到字符串

那么,除了这两个功能之外,还有其他的选择吗?或者,有没有办法让这两个功能为我工作

    char *cipher_str = (char *)malloc(sizeof(char) * 26);
    for (int j = 0; j < col; j++) {
        for (int i = 0; i < col; i++) {
            if (min == cipher[0][i] && (done[i] != 1)) {
                done[i] = 1;
                for (int k = 0; k < rows; k++)
                    strcat(cipher_str, cipher[i][k]);
                }
            }
            ...
char*cipher\u str=(char*)malloc(sizeof(char)*26);
对于(int j=0;j
这里最简单的方法就是将字符“手动”附加到字符串中,例如:

    int m=0;

    ....
        cipher_str[m++]=cipher[i][k];
    ....
    cipher_str[m]='\0';

由于您使用strcat附加1个字符,因此可以使用此函数

void strcat(char* dest, char src)
{
    int size;
    for(size=0;dest[size]!='\0';++size);
    dest[size]=src;
    dest[size+1]='\0';
}
您提到在“cipher_str”的末尾有“\0”,我用它来确定长度

C中strcat和strncat函数的另一种替代方法是什么

内联代码可以很好地与
size\t m
配合使用,就像与answer配合使用一样

作为独立功能:

char *strcat_c(char *s, char c) {
  size_t len = strlen(s);
  s[len++] = c;
  s[len] = '\0';
  return s;
}

char *strncat_c(char *s, char c, size_t n) {
  char sc[2] = { c, '\0' };
  return strncat(s, sc, n);
}

// or with C11 compound literals

char *strncat_c(char *s, char c, size_t n) {
  return strncat(s, (char [2])  { c, '\0' }, n);
}

将单个字符转换为长度为1的字符串,然后使用
strcat()


小心缓冲区溢出

您的代码存在多个问题:

  • cipher\u str
    malloc()
    一起分配,因此未初始化。将其作为
    strcat()
    的目标字符串传递具有未定义的行为,因为它不包含正确的字符串

  • char
    作为第二个参数传递给
    strcat
    是不正确的。如果坚持使用函数附加单个
    char
    ,可以编写:

    char *cipher_str = calloc(26);
    for (int j = 0; j < col; j++) {
        for (int i = 0; i < col; i++) {
            if (min == cipher[0][i] && done[i] != 1) {
                done[i] = 1;
                for (int k = 0; k < rows; k++)
                    strncat(cipher_str, &cipher[i][k], 1);
                }
            }
            ...
    

    请提供
    密码的定义
    。对于仅附加一个字符,您可以使用
    int l=strlen(s);s[l]=ch;s[l+1]=0;
    (前提是您有足够的空间分配给s)@PaulOgilvie char cipher[rows][col;@PaulOgilvie为丢失的数据片段感到抱歉,然后在处理之前将密码初始化为“\0”,并修改将缓冲区初始化为零(使用memset)并使用memcpy而不是strcat。通常,语法为memcpy(buf+pos,&ch,1);
    char data[1000] = "foo";
    appendchar(data, 'b');
    appendchar(data, 'a');
    appendchar(data, 'r');
    puts(data);
    
    char *cipher_str = calloc(26);
    for (int j = 0; j < col; j++) {
        for (int i = 0; i < col; i++) {
            if (min == cipher[0][i] && done[i] != 1) {
                done[i] = 1;
                for (int k = 0; k < rows; k++)
                    strncat(cipher_str, &cipher[i][k], 1);
                }
            }
            ...
    
    char *cipher_str = (char *)malloc(sizeof(char) * 26);
    int ii = 0;
    for (int j = 0; j < col; j++) {
        for (int i = 0; i < col; i++) {
            if (min == cipher[0][i] && (done[i] != 1)) {
                done[i] = 1;
                for (int k = 0; k < rows; k++) {
                    if (ii < 25) {
                        cipher_str[ii++] = cipher[i][k];
                    } else {
                        // cipher_str is too short for the job.
                    }
                }
            }
            cipher_str[ii] = '\0';
            ...