#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 并且连接
但是,发生了访问错误
如何将字符串设为字符串或如何连接字符串和字符串?
答案 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)
结束......