免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dagobert1989
打印 上一主题 下一主题

[C] 小写转大写程序,显示段错误 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-05-06 12:24 |只看该作者
10楼正解

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
22 [报告]
发表于 2011-05-06 13:12 |只看该作者
LZ的uppers支持两种用法:1、us==s,即修改原内容;2、us != s,拷贝s到us。要求us < s || u >= s+LENGTH(s);

论坛徽章:
0
23 [报告]
发表于 2011-05-08 08:11 |只看该作者
10楼是正解,
转换后的字符数组,应该分配空间。

论坛徽章:
0
24 [报告]
发表于 2011-05-08 10:22 |只看该作者
#include <stdio.h>
#include <stdlib.h>
void uppers(char *s,char *us)
{
       
        for(;*s!='\0';s++,*us++)
        {
                if(*s>='a'&&*s<='z')
                       *us=*s-32;
                else
                        *us=*s;
                               
        }
                *us = '\0';
               
}
int main(void)
{
        char *s,us[20];
        char ss[20];
        printf("Please input a string:\n");
        scanf("%s",ss);
        s=ss;
        uppers(s,us);
        printf("The result is:\n%s\n",us);
        getchar();
        return 0;
}
这是你问题的代码,很简单的题,楼主还是任重道远,一起努力吧。。。

论坛徽章:
0
25 [报告]
发表于 2011-05-08 22:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
26 [报告]
发表于 2011-05-09 09:05 |只看该作者
us就是个野指针啊

论坛徽章:
0
27 [报告]
发表于 2011-05-09 14:54 |只看该作者
本帖最后由 pinkguy 于 2011-05-09 15:07 编辑
#include

void uppers(char *s,char *us)
{
        for(;*s!='\0';s++,us++)
        {
          ...
dagobert1989 发表于 2011-05-04 14:48



#include <stdio.h>

void uppers(char *s,char *us)
{
    for(;*s!='\0';s++,us++)
    {   
        if(*s>='a'&&*s<='z')
            *us=*s-32;
        else
            *us=*s;
    }   
    *us = '\0'; /* must end with '\0' */
}

int main()
{
    /* char *s,*us; */
    char *s,us[20];
    char ss[20];
    printf("Please input a string:\n");
    /* scanf("%s",ss); */
    fgets(ss, sizeof(ss), stdin); /* much safer */
    s=ss;
    uppers(s,us);
    printf("The result is:\n%s\n",us);
    return 0;
}

论坛徽章:
0
28 [报告]
发表于 2011-05-09 18:44 |只看该作者
us初始化为数组或者使用malloc分配堆中内存
顶10楼

论坛徽章:
0
29 [报告]
发表于 2011-05-09 19:22 |只看该作者
10楼正解.
楼主记住一点,段错误就是对一此内存段进行非法操作引发的错误,常见的非法操作包括对空指针赋值,修改字符串常量,对野指针(未分配合法空间的指针)赋值。
你举的例子中us就是野指针,由于它指向内存区域是随机的,当指向一些指读区域如操作系统占用的内存区域时对其进行写操作就会引发段错误。
解决方法就是对症下药,1.让us指向栈上 分配空间(静态数组)2.让us指向堆上分配空间(用malloc等函数)。

论坛徽章:
0
30 [报告]
发表于 2011-05-10 11:22 |只看该作者
这个程序有两个错误:一个是确实是溢出了,另一个是确实是没有初始化指针。

程序运行失败是因为指针没有被初始化
即是初始化了后,也有溢出的问题。
上面27楼的那个代码应该是没什么问题的了。

如果楼主一定要用scanf函数的话应该要在 uppers 函数的末端加上 *us = '\0' 。


#include <stdio.h>

void uppers(char *s,char *us)
{
        for(;*s!='\0';s++,us++)
        {
                if(*s>='a'&&*s<='z')
                        *us=*s-32;
                else
                        *us=*s;
        }
                *us = '\0'; // 添加
}

int main(void)
{
        char *s,*us;
        char ss[20];
                char uss[20]; // 添加
        printf("Please input a string:\n");
        scanf("%s",ss);
        s=ss;
                us = uss; // 添加
        uppers(s,us);
        printf("The result is:\n%s\n",us);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP