如何连接字符和字符串/如何将字符转换为字符串 #包括 #包括 #包括 #定义最大尺寸20 void main() { int i,j; 字符*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);//应用程序 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)); 对于(i=0;i

如何连接字符和字符串/如何将字符转换为字符串 #包括 #包括 #包括 #定义最大尺寸20 void main() { int i,j; 字符*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);//应用程序 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)); 对于(i=0;i,c,C,部分地, 我想连接str3[I-1]和str\u mid但是,str3[I-1]是字符类型。 因此,使临时字符串为ch并进行连接。 但是,发生了访问错误。 如何将字符转换为字符串,或者如何连接字符和字符串?要连接字符和字符串(首先是字符,然后是字符串),请执行以下操作: 这里的len应该是strlen(str)语句str_mid=”“将costant字符串的地址“分配给指针str_mid,这将导致以后出现段故障。使用str_mid[0]='\0'取而代之 在语句ch=str3[i-1]中,您正在

部分地,
我想连接str3[I-1]str\u mid但是,str3[I-1]是字符类型。
因此,使临时字符串为ch并进行连接。
但是,发生了访问错误。

如何将字符转换为字符串,或者如何连接字符和字符串?

要连接字符和字符串(首先是字符,然后是字符串),请执行以下操作:


这里的
len
应该是
strlen(str)
语句
str_mid=”“
将costant字符串的地址
分配给指针
str_mid
,这将导致以后出现段故障。使用
str_mid[0]='\0'取而代之

在语句
ch=str3[i-1]中,您正在将
字符
分配给
字符指针
,这将导致段故障

如果只需在字符串中添加一个字符,则可以跟踪字符串的长度,如下所示:

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;
}
{
  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)
len_mid=strlen(str_mid);
对于(i=1;i
只要
MAX\u SIZE
足够大,使
str\u mid
能够容纳额外的字符,就可以使用
strcat()
和复合文字(用于C99或更高版本):


请注意,在您的代码中,
str3[i-1]
是一个
char
,而您将
ch
声明为指向
char
C-club的第一条规则,创建您自己的字符串缓冲区,C-club的第二条规则创建您自己的字符串缓冲区。 每个程序员都有自己的字符串缓冲区。最低要求是:

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

如何连接字符和字符串

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

假设
str_mid
足够大,只需执行以下操作:

 #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)

要仍能使用函数,您可能需要将上述代码包装成如下宏:

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;
}
{
  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)
然后像这样使用它:

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

高级语言中的字符串是缓冲区的抽象-可以是不可变的、固定大小的、预分配的或扩展的(所有这些都有或没有通道内的sentinel值,通常是
\0
aka“null-terminated string”)。C不定义自己的字符串类型,尽管大多数库使用固定大小的缓冲区。你需要自己处理这个问题。OT:
sizeof(char)
1
be定义。OT^2:不要用C来转换malloc和friends,它只是无用的。长度值应该输入为
size\u t
,而不是
int
。这假设
ch
char
,而OP的代码则不是。@alk--谢谢。我没有注意到OP将
ch
声明为指向
char
的指针。尽管这种方法不必要地(调用
strcat()
)昂贵,但它仍然是使用复合文字的一个很好的例子:1+@alk——谢谢。我更喜欢您的解决方案,但OP试图使用
strcat()
,所以我想我会朝这个方向走。另外,复合文本非常简洁:)我将strcpy()改为memcpy(),这样您也可以连接子字符串;注意不要错过
0
-然后终止结果。“每个程序员都有自己的字符串缓冲区。”我对此表示怀疑。是的,你说得对,不是“每个程序员”都有自己的字符串缓冲区,而是“每个程序员”都有自己的字符串缓冲区。和“P”国会大厦。因此,只要提名我处理“RedisModule_String”、postgres的“varlena”、wxWidgets的“wxString”、Windows的LPTSTR的最后一个API。。。等等这种语言非常合适,没有人会解释它们的作用域,函数被精确地称为“concat_buffer”“concat_string”等等……至少
LPTSTR
只是一个指针。那里没有缓冲器!“这将导致segmentfault。”不一定,不。@alk,对指针强制转换另一个类型,然后取消对指针的引用几乎总是导致segmentfault。@smilingwang--未定义的行为不一定是seg错误。@alk,哪一个是未定义的行为?@smilingwang--
ch=str3[i-1]
甚至不会使用gcc编译,因为
ch
是指针,
str3[i-1]
char
。按照我阅读该标准的方式,试图修改str_mid
所指的字符串文字是一种违反约束的行为:“赋值运算符应具有一个可修改的左值作为其左操作数。”(ISO/IEC 2011 6.5.16/2)。虽然这里没有明确地称为未定义的行为,但这似乎是一个公平的选择