您好我正在尝试使用C将String插入位置N的String中。所以我开发了一个很好的功能,但问题是工作一次。 这是我的代码:
char *substring(char *string, int position, int length)
{
char *pointer;
int c;
pointer = (char*) malloc(length+1);
if( pointer == NULL )
exit(EXIT_FAILURE);
for( c = 0 ; c < length ; c++ )
*(pointer+c) = *((string+position-1)+c);
*(pointer+c) = '\0';
return pointer;
}
void insert_substring(char *a, char *b, int position)
{
char *f, *e;
int length;
length = strlen(a);
f = substring(a, 1, position - 1 );
e = substring(a, position, length-position+1);
strcpy(a, "");
strcat(a, f);
free(f);
strcat(a, b);
strcat(a, e);
free(e);
}
int main(void) {
char username[UNLEN+1];
DWORD username_len = UNLEN+1;
GetUserName(username, &username_len);
char msg1 [] ="Good morning mr ";
char msg2 [] ="Good evening mr ";
insert_substring(msg1,username,17);
printf("%s\n",msg1);
insert_substring(msg2,username,17);
printf("%s\n",msg2);
return 0;
}
程序显示一条消息:
早上好XXXXX先生
我注意到,在第二次调用insert_substring之后程序没有执行任何指令。它没有显示任何错误。也许这是函数
中使用的局部变量的问题答案 0 :(得分:0)
查看您的代码,您似乎正在尝试调用Win32 API
个函数,获取当前用户的用户名并根据一天中的时间打印问候语消息(但您没有实现此功能部分)。
当连接两个以null结尾的字符串时,您需要确保目标缓冲区有足够的空间来容纳您连接的两个字符串。
在您的情况下,您已经知道通过使用UNLEN
宏来保留用户名所需的最大空间。
因此,您可以使用大小为sizeof(msg1) + UNLEN
的缓冲区,通过malloc进行分配。像这样的东西:
char *target_msg1 = (char *)malloc(sizeof(msg1) + UNLEN);
您甚至可以使用lpnSize
的{{1}}参数并尽可能少地分配空间,但是因为您正在进行Win32编程,所以我不认为几个字节的内存很多一个问题。
您的代码会改变如下:
GetUserName