char *s="abcd";
这句话在c++书的前面基础章节里介绍过,s是栈中分配的指针,它指向个内存常量"abcd",也就是说s可以改变,如s="jksl"只不过又指向了内存中另一个常量jksl",但是内存里的常量不能改变,所以*s='a'肯定出错,因为你试图更改内存常量了。
strupr(s)
这个函数定义如下:
char* strupr(char * string)
{
char *cp;
for (cp = string; *cp; ++cp) {
if ('a' <= *cp && *cp <= 'z')
*cp += 'A' - 'a';
}
return(string);
}
这句话里有*cp += 'A' - 'a'这个,所以你试图更改内存常量,当然是非法的。那怎么更改右2个方法:
1.char s[]="abcd";数组是直接在栈中分配的,你可以放心使用*='某某'
2.使用函数strdup复制一个字符串。
下面对这两种方法写下代码:
1.
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
char s[]="abcd";
printf("%s",strupr(s));
return 0;
}
2.
#include <string.h>
#include <stdio.h>
#include<malloc.h>
int main(int argc, char* argv[])
{
char* s="abcd";
char* p=strdup(s);
printf("%s",strupr(p));
free(p);
return 0;
}
所以抱歉了,我打破了你发现vc中bug的梦了。