如何连接字符和字符串/如何将字符转换为字符串 #包括 #包括 #包括 #定义最大尺寸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)。虽然这里没有明确地称为未定义的行为,但这似乎是一个公平的选择