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

时间:2017-02-27 15:34:07

标签: 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'结尾。我需要将一个字符连接到一个字符串。

那么这两个函数还有其他选择,还是有办法让这些函数适合我?

    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]);
                }
            }
            ...

5 个答案:

答案 0 :(得分:5)

这里最简单的方法就是将字符“手动”附加到字符串中,例如:

    int m=0;

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

答案 1 :(得分:2)

由于您使用strcat附加1个字符,因此可以使用此功能。

void strcat(char* dest, char src)
{
    int size;
    for(size=0;dest[size]!='\0';++size);
    dest[size]=src;
    dest[size+1]='\0';
}

你提到你有&#39; \ 0&#39;在你的cipher_str&#39;结束时,我用它来确定长度。

答案 2 :(得分:0)

  

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

内联代码可以与size_t m一起使用,就像@Paul Ogilvie回答一样。

作为独立功能:

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);
}

答案 3 :(得分:0)

将单个字符转换为长度为1的字符串,然后使用Thread1:0 Thread2:0 Thread3:0 Thread4:0 Thread1:1 Thread2:1 Thread3:1 Thread4:1 Thread1:2 Thread2:2 Thread3:2 Thread4:2 Thread1:3 Thread2:3 Thread3:3 Thread4:3 Thread1:4 Thread2:4 Thread3:4 Thread4:4 Thread1:5 Thread2:5 Thread3:5 Thread4:5 Thread1:6 Thread2:6 Thread3:6 Thread4:6 Thread1:7 Thread2:7 Thread3:7 Thread4:7 Thread1:8 Thread2:8 Thread3:8 Thread4:8 Thread1:9 Thread2:9 Thread3:9 Thread4:9 Thread1:10 Thread2:10 Thread3:10 Thread4:10

strcat()
#include <string.h>

void appendchar(char *x, char y) {
    char z[2];
    z[0] = y;
    z[1] = 0;
    strcat(x, z);
}

注意缓冲区溢出

答案 4 :(得分:0)

您的代码存在多个问题:

  • cipher_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);
                }
            }
            ...
    

但是为这个简单的任务调用一个函数是不合适的,你不会检查cipher_str是否足够长。

这是一个更简单的解决方案,带有索引变量:

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';
        ...