当前位置: 代码迷 >> C语言 >> 大家来找茬 程序改错
  详细解决方案

大家来找茬 程序改错

热度:345   发布时间:2008-06-16 10:28:15.0
大家来找茬 程序改错
提示: 作者被禁止或删除 内容自动屏蔽
2008-06-16 02:28:15
zhangjilie

等 级:新手上路
帖 子:4
专家分:0
注 册:2008-6-16
  得分:0 
为什么我一个都没看出来呢?
哪位高手说说啊?
----------------解决方案--------------------------------------------------------
哇靠,这程序实在极品
看了一下,发现一个错误
VC编译一下,有两个warning,其实是错误
单步执行了几次,发现三个错误

不知道还有没有....
----------------解决方案--------------------------------------------------------
1: while(*str != NULL)
字符串的结束应该是‘\0’,不是NULL吧?

2:return ret;
ret是一个局部变量,在方法结束之后,该数组已经被释放,指到了意想不到的位置;

3:既然用了malloc,那么应该#include  <malloc.h>吧?

4:GetMemory(pAll);
真的能给pAll分配空间么?
----------------解决方案--------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STRING "FdfsJK32f47h5"
#define PRINT_ARRAY(x) if((x) != NULL) printf("%s\n", (x))

void LowToUp(char * str)
{
    while(*str != NULL)
    {
        if((*str >= 'a')&&(*str <= 'z'))
        {
            *str += 'A' - 'a';//错误一,运行时发现
        }
        str++;
    }
}

int GetMemory(char* p)//错误二,目测发现
{
    p = (char*)malloc(strlen(STRING));//错误三,单步时发现
    if(p == NULL) return -1;
    else return 1;
}

char * GetNumber(char * str)
{
    char ret[100];
    int i = 0;
    while(*str != NULL)
    {
        if((*str >= '0')&&(*str <= '9'))
        {
            ret[i++] = *str;
        }
        str++;
    }
    ret[i] = '\0';
    return ret;//错误四,编译时发现
}

char * GetLetter(char * str)
{
    char ret[100];
    int i = 0;
    while(*str != NULL)
    {
        if((*str >= 'A')&&(*str <= 'Z'))
        {
            ret[i++] = *str;
        }
        str++;
    }
    ret[i] = '\0';
    return ret;//错误五,编译时发现
}

int main()
{
    char *pAll=NULL;
    char *pNumber=NULL;
    char *pLetter=NULL;

    LowToUp(STRING);    //1. 将串中小写字符转化成大写
    if(GetMemory(pAll) == 1)    //内存分配
    {
        strcpy(pAll, STRING);
        pNumber = GetNumber(pAll);    //2. 提取出所有数字
        pLetter = GetLetter(pAll);    //3. 提取出所有字母
        if((pAll[0] >= '0')&&(pAll[0] <= '9')) PRINT_ARRAY(pNumber);    //错误六,单步了几次才发现
        else PRINT_ARRAY(pLetter);
        free(pAll);
        return 1;
    }
    else
    {
        printf("No Memory can be used!\n");
        return -1;
    }
}
----------------解决方案--------------------------------------------------------
提示: 作者被禁止或删除 内容自动屏蔽
2008-06-16 03:34:21
zhangjilie

等 级:新手上路
帖 子:4
专家分:0
注 册:2008-6-16
  得分:0 
听不懂啊
----------------解决方案--------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STRING "FdfsJK32f47h5"  //常量存储区,不能被修改
#define PRINT_ARRAY(x) if((x) != NULL) printf("%s\n", (x))

void LowToUp(char * str)
{
    while(*str != NULL)
    {
        if((*str >= 'a')&&(*str <= 'z'))
        {
            *str += 'A' - 'a';
        }
        str++;
    }
}

int GetMemory(char* p)  //如果是以空指针传入,则内存丢失
{
    p = (char*)malloc(strlen(STRING));
    if(p == NULL) return -1;
    else return 1;
}

char * GetNumber(char * str)
{
    char ret[100];
    int i = 0;
    while(*str != NULL)
    {
        if((*str >= '0')&&(*str <= '9'))
        {
            ret[i++] = *str;
        }
        str++;
    }
    ret[i] = '\0';
    return ret;   //返回局部变量,外部指针指向该区域时,已释放...但是内容可能保留,所以可能输出结果..
}

char * GetLetter(char * str)
{
    char ret[100];
    int i = 0;
    while(*str != NULL)
    {
        if((*str >= 'A')&&(*str <= 'Z'))
        {
            ret[i++] = *str;
        }
        str++;
    }
    ret[i] = '\0';
    return ret;  //返回局部变量,外部指针指向该区域时,已释放...但是内容可能保留,所以可能输出结果..
}

int main()
{ //看了别人找的,发现自己还差很多 - -
    char *pAll=NULL;
    char *pNumber=NULL;
    char *pLetter=NULL;
    LowToUp(STRING);    //1. 将串中小写字符转化成大写
    if(GetMemory(pAll) == 1)    //内存分配
    {
        strcpy(pAll, STRING);
        pNumber = GetNumber(pAll);  //2. 提取出所有数字
        pLetter = GetLetter(pAll);    //3. 提取出所有字母
        if((pAll[0] >= '0')&&(pAll[0] <= '9')) PRINT_ARRAY(pNumber);    //打印
        else PRINT_ARRAY(pLetter);
        free(pAll);
        return 1;
    }
    else
    {
        printf("No Memory can be used!\n");
        return -1;
    }
}

[[it] 本帖最后由 中学者 于 2008-6-16 13:27 编辑 [/it]]

[[it] 本帖最后由 中学者 于 2008-6-16 13:28 编辑 [/it]]
----------------解决方案--------------------------------------------------------
怎么都是没有听过的错误
----------------解决方案--------------------------------------------------------
那应该怎么写呢?
----------------解决方案--------------------------------------------------------
  相关解决方案