函数只执行一次C

时间:2017-07-20 13:24:50

标签: c

您好我正在尝试使用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之后程序没有执行任何指令。它没有显示任何错误。也许这是函数

中使用的局部变量的问题

1 个答案:

答案 0 :(得分:0)

查看您的代码,您似乎正在尝试调用Win32 API个函数,获取当前用户的用户名并根据一天中的时间打印问候语消息(但您没有实现此功能部分)。

当连接两个以null结尾的字符串时,您需要确保目标缓冲区有足够的空间来容纳您连接的两个字符串。

在您的情况下,您已经知道通过使用UNLEN宏来保留用户名所需的最大空间。

因此,您可以使用大小为sizeof(msg1) + UNLEN的缓冲区,通过malloc进行分配。像这样的东西:

char *target_msg1 = (char *)malloc(sizeof(msg1) + UNLEN);

您甚至可以使用lpnSize的{​​{1}}参数并尽可能少地分配空间,但是因为您正在进行Win32编程,所以我不认为几个字节的内存很多一个问题。

您的代码会改变如下:

GetUserName