| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1015 人关注过本帖
标题:strupr函数奇怪问题??不知道是不是vc的Bug
只看楼主 加入收藏
寻找
Rank: 2
等 级:论坛游民
帖 子:132
专家分:19
注 册:2007-3-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
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;
}
这段代码编译通过,运行却出错??请问到底是什么问题呢?觉得代码是没问题的
那为什么呢??郁闷..希望帮助解答..谢谢
搜索更多相关主题的帖子: strupr函数奇怪问题 
2009-08-14 18:14
xufen340
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:166
专家分:1351
注 册:2009-8-7
收藏
得分:20 
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的梦了。


2009-08-14 21:05
寻找
Rank: 2
等 级:论坛游民
帖 子:132
专家分:19
注 册:2007-3-2
收藏
得分:0 
谢谢,呵,问题已发现了,就字符串指针和字符串常量的问题,还是很谢谢楼上朋友关注解答
2009-08-14 22:30
快速回复:strupr函数奇怪问题??不知道是不是vc的Bug
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013699 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved