【问题标题】:What is another alternative to strcat and strncat functions in C?C 中 strcat 和 strncat 函数的另一种替代方法是什么?
【发布时间】:2017-07-18 07:07:18
【问题描述】:

这是我在使用 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]);
                }
            }
            ...

【问题讨论】:

  • 请提供cipher的定义。
  • 对于只附加一个字符,你可以使用int l = strlen(s); s[l] = ch; s[l+1] = 0;(前提是你有足够的空间分配给s)
  • @PaulOgilvie 字符密码[rows][col];
  • @PaulOgilvie 很抱歉丢失了一条数据,密码在被处理和修改之前被初始化为“\0”
  • 将缓冲区初始化为零(使用 memset)并使用 memcpy 而不是 strcat。一般来说,语法是 memcpy(buf+pos, &ch, 1);

标签: c string character strcat


【解决方案1】:

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

    int m=0;

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

【讨论】:

    【解决方案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';
    }
    

    你提到你的“cipher_str”末尾有“\0”,我用它来确定长度。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        #include <string.h>
        
        void appendchar(char *x, char y) {
            char z[2];
            z[0] = y;
            z[1] = 0;
            strcat(x, z);
        }
        

        char data[1000] = "foo";
        appendchar(data, 'b');
        appendchar(data, 'a');
        appendchar(data, 'r');
        puts(data);
        

        小心缓冲区溢出

        【讨论】:

          【解决方案5】:

          您的代码存在多个问题:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-09
            • 2014-05-26
            • 1970-01-01
            • 1970-01-01
            • 2011-01-15
            • 2012-01-27
            • 1970-01-01
            • 2015-07-22
            相关资源
            最近更新 更多