strupr()函数奇怪问题

时间:2022-12-10 17:01:02
strupr函数奇怪问题??不知道是不是vc的Bug

#include "stdafx.h"
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
    char *s="abcd";
    printf("%s",strupr(s));
    return 0;
}
这段代码编译通过,运行却出错??请问到底是什么问题呢?觉得代码是没问题的
那为什么呢??郁闷..希望帮助解答..谢谢

 

 

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的梦了。