如何连接char和string /如何使char成为字符串

时间:2016-12-17 03:37:09

标签: c

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

#define MAX_SIZE 20

void main()
{
   int i, j;
   char *str1, *str2, *str3, *str_mid;
   bool **lcs1, **lcs2;
   int len1, len2, len3, len_mid;
   char *ch = (char*)malloc(sizeof(char) * 3);


   str1     = (char*)malloc(sizeof(char)*MAX_SIZE); //applicatian
   str2     = (char*)malloc(sizeof(char)*MAX_SIZE); //apiasn
   str3     = (char*)malloc(sizeof(char)*MAX_SIZE); //apun
   str_mid  = (char*)malloc(sizeof(char)*MAX_SIZE); //apn

   str_mid = "";

   scanf("%s", str1);
   scanf("%s", str2);
   scanf("%s", str3);

   len1 = strlen(str1);
   len2 = strlen(str2);
   len3 = strlen(str3);

   //str2, str3 ->str_mid (lcs1)
   lcs1 = (bool**)malloc(sizeof(bool*)*(len3 + 1));
   for (i = 0; i < len3 + 1; i++)
      lcs1[i] = (bool*)malloc(sizeof(bool)*(len2 + 1));

   for (i = 0; i < len3 + 1; i++)
      for (j = 0; j < len2 + 1; j++)
         lcs1[i][j] = false;

   for (i = 1; i < len3 + 1; i++)
      for (j = 1; j < len2 + 1; j++)
         if (str3[i-1] == str2[j-1])
            lcs1[i][j] = true;

   for (i = 1; i < len3 + 1; i++)
   {
      for (j = 1; j < len2 + 1; j++)
         if (lcs1[i][j])
         {
            //<--- error
            ch = str3[i - 1];
            strcat(str_mid, ch);
            //--->
            break;
      }
   }

   //printf("%s", str_mid);
   //str_mid, str1 (lcs2)

}

In&lt; --- error ---&gt;部分,
我想连接 str3 [i-1] str_mid 但是, str3 [i-1] 是字符类型。
因此,临时字符串是 ch 并且连接 但是,发生了访问错误 如何将字符串设为字符串如何连接字符串和字符串?

5 个答案:

答案 0 :(得分:3)

只要MAX_SIZE足够大,str_mid能够容纳额外的字符,就可以使用strcat()和复合文字(对于C99或更高版本):

strcat(str_mid, (char[2]){ str3[i - 1], '\0' });

请注意,在您的代码中,str3[i - 1]char,而您已将ch声明为char的指针。

答案 1 :(得分:1)

  

如何连接char和string

no 根本不需要调用任何库函数,也不需要动态分配任何内存。

假设str_mid足够大,只需:

{
  size_t tmp_len = strlen(str_mid);
  str_mid[tmp_len] = str3[i - 1];
  str_mid[tmp_len + 1] = '\0';
}

仍然有使用函数的感觉,您可能希望将上面的代码包装成这样的宏:

#define STRCATCHAR(s, c) \
do { \
  assert(s != NULL); \
  size_t tmp_len = strlen(s); \
  (s)[tmp_len] = (c); \
  (s)[tmp_len + 1] = '\0'; \
} while (0)

并像这样使用它:

STRCATCHAR(str_mid, str3[i - 1]);

答案 2 :(得分:0)

连接char和string(第一个char,然后是string)do:

const char* conc_char_string(const char ch, const char* str, int len) {
    const char* out = malloc(len + 2); /* 1 char from ch, len chars from str, and zero character, totally len+2 */
    out[0] = ch; /* copy the character */
    strcpy(out+1, str); /* copy the string */
    return out;
}

此处len应为strlen(str)

答案 3 :(得分:0)

语句str_mid = "";将costant字符串""的地址分配给指针str_mid,稍后会导致 segmentfault 。请改用str_mid[0] = '\0';

在声明ch = str3[i - 1];中,您要将char分配给char pointer,这会导致段故障

如果您只想将字符附加到字符串中,则可以跟踪字符串的长度,如下所示:

len_mid = strlen(str_mid);
for (i = 1; i < len3 + 1; i++)
{
  for (j = 1; j < len2 + 1; j++)
     if (lcs1[i][j])
     {

        str_mid[len_mid++] = str3[i - 1];
        str_mid[len_mid] = '\0';
        break;
     }
}

答案 4 :(得分:-1)

C-club的第一条规则,创建自己的字符串缓冲区,C-club的第二条规则创建自己的字符串缓冲区。 每个程序员都有自己的字符串缓冲区。最低要求是:

 #define STRINGSTRTSZ 256
 typedef struct string
 {
     char *str;
     size_t n;
     size_t buf_sz;

  }String,*pString;

  pString new_string()
  {
      pString res;
      res=malloc(sizeof(String)); ///i leave to you the error handling
      res->bus_sz=STRINGSTRSZ;
      res->n=0;
      res->str=malloc(res->bus_sz); 
  }
  char*concatbase(pString *string,char*s,size_t len)
  {
      if(len+1>=string->buf_sz-string->n)
      {
           res->buf_sz+=len+res->buf_sz; 
           char *tmp=realloc(string->str,res->buf_sz);
            if(tmp)
               string->str=tmp;
            else
              ...
      }
     memcpy(string->str+string->n,s,len);
     string->n+=len;
     *(string->str+string->n)='\0';
     return string->str;  
  }

  #define concatNllPtr(string,nllptr) concatbase(string,nllptr,strlen(nllptr))
  #define concatString(string,str2) concatbase(string,(str2)->str,(str2)->n)

结束......