一道字符串题目的随想

 这是一道微软笔试题,题目出自http://hi.baidu.com/danforn/blog/item/91b104fa4297cd9558ee906e.html。

原体如下:

2.下来程序想打印“Welcome MSR Asia”,改正错误

#include
#include
char * GetName (void)
{
   //To return “MSR Asia” String
   char name[]="MSR Asia";
   return name;
}
void main(int argc, char* argv[])
{
   char name[32];
   //Fill in zeros into name
   for(int i=0;i<=32;i++)
   {
     name='/0';
   }
   //copy “Welcome” to name
   name="Welcome";
   //Append a blank char
   name[8]=" ";
   //Append string to name
   strcat(name,GetName());
   //print out
   printf(name);
}
答:改正后为

#include
#include
char * GetName (void)
{
   //To return “MSR Asia” String
   //char name[]="MSR Asia";       (1)  
         char *name=(char *)malloc(strlen("MSR Asia")+1);    
   strcpy(name,"MSR Asia");
   return name;
}
void main(int argc, char* argv[])
{
   char name[32];
   //Fill in zeros into name
   for(int i=0;i<=32;i++)
   {
     name='/0';
   }
   //copy “Welcome” to name
   //name="Welcome";         (2)
   strcat(name,"Welcome ");
   //Append a blank char
//   name[8]=' ';             (3)
   //Append string to name
   char *p=GetName();         (4)
   strcat(name,p);
   free (p);
   //print out
   printf(name);
}
原因:(1)在函数内部定义的变量在函数结束时就清空了,必须动态分配内存
(2)字符串赋值语句错误,应该用strcat
(3)该语句无效,可去掉
(4)定义一个指针指向动态分配的内存,用完后需用free语句释放

看到“原因”,真是很有收获:

(1)char name[]="MSR Asia";
          return name;

"MSR Asia"被临时放在栈中,它的地址的确放在了name中,而且也的确正确的返回了name里的内容。可是在返回之后name里的内容就没有意义了,因为内存已经收回了临时的栈空间。而堆里的东西却不因程序块的结束而消失,正是用武之地啊。

(2)char name[32];

         name="Welcome";

"Welcome"是一个临时的字符串数组,只不过没有名字。上述赋值语句相当于把一个长度为7的数组整体赋值给一个长度为32的数组,编译时有错误(如果name是字符指针就没有问题,看来字符指针和字符数组也不是完全可以互换的,把数组看成指针是有限制的)。

(3)strcat本身不够完善,编译连接运行时都不会对第一个参数做越界检查也不会报错,很有可能先调用它没什么问题,可是后面的处理又出了莫名的问题。

(4)最好在最后加一个p = NULL。免得误用。

你可能感兴趣的:(一道字符串题目的随想)