| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 278 人关注过本帖
标题:发现一个很奇怪的问题...
只看楼主 加入收藏
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
结帖率:97.22%
收藏
已结贴  问题点数:31 回复次数:7 
发现一个很奇怪的问题...
程序代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#include <stdlib.h>

typedef struct information
{
    char name[18];
    char phone[50];
}person;

int Input(person people[])
{
    int count = 0;
    char answer = 'n';

    for(;;)
    {
        printf("姓名:");
        gets(people[count].name);
        printf("电话:");
        gets(people[count++].phone);
        printf("还需要输入?(y/n):");
        scanf(" %c",&answer);

        while(getchar() != '\n');
        if(tolower(answer) == 'n')
            break;
    }
    return count;
}

char *zhuanhuan(char *);

int main(void)
{
    person people[18];
    int count = 0;
    char answer[18] ;
    int i = 0;
    char *temp = NULL;
    char *temp2 = NULL;

    count = Input(people);

    for(;;)
    {
      printf("\n\n\n需要查看信息?(打入名字或者All查看全部):");
      gets(answer);

      if(answer[0] == 'n')
          break;

      if(strcmp(temp = zhuanhuan(answer), "all") == 0)
      {
          free(temp);
          printf("\nAll the information:");
          for(i=0;i<count;i++)
              printf("\nname:%s\nphone:%s\n\n",people[i].name,people[i].phone);
           break;
      }
      else
        {
            printf("\nt = %s\n",temp);
            free(temp);/* 释放没有释放的temp */
            temp = NULL;
            printf("运行");
        for(i=0;i<count;i++)
        {
          if(strcmp(temp = zhuanhuan(answer), temp2 = zhuanhuan(people[i].name)) == 0)
          {
              printf("\nPersonal information:\nname:%s\nphone:%s\n",people[i].name,people[i].phone);
              free(temp);
              free(temp2);
              break;
          }
          free(temp);
          free(temp2);
        }
       }
    }
    return 0;
}

char *zhuanhuan(char *temp)
{
    char *ptemp = (char*)malloc(sizeof temp);
    int i = 0;

    strcpy(ptemp,temp);
   
    for(i=0;i<(int)strlen(ptemp);i++)
    ptemp[i] = tolower(ptemp[i]);

    printf("p = %s\nt = %s\n",ptemp,temp);
    return ptemp;
}

在这里一旦输出的名字多于4个字符如"jdaa"(包括终止符)我的电脑就会出警告
图片附件: 游客没有浏览图片的权限,请 登录注册

但全部忽略一样可以正常运行,而且是释放temp的空间是出的警告,可在那之前专门检测过temp,里面有数据啊...只希望各位仁兄们把源代码复制一下,运行下看是不是和我一样的结果
搜索更多相关主题的帖子: color 
2012-12-16 18:37
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:16 
你把sizeof(temp)打印出来看看是多少?

总有那身价贱的人给作业贴回复完整的代码
2012-12-16 19:03
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:15 
char *zhuanhuan(char *temp)
{
    char *ptemp = (char*)malloc(sizeof temp); // sizeof(temp) 在32位系统是4个字节的,他只是一个指针
   // 你把它改成char *ptemp = (char*)malloc((strlen(temp) + 1) * sizeof(char)); 就行了。

    int i = 0;

    strcpy(ptemp,temp);

    for(i=0;i<(int)strlen(ptemp);i++)
        ptemp[i] = tolower(ptemp[i]);

    printf("p = %s\nt = %s\n",ptemp,temp);
    return ptemp;
}

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-16 19:20
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
sizeof(temp)计算的是一个指针的字节,为4,我懂了谢谢
strlen(temp)+1,只能用这个表达式申请它的空间了吗?还有没有其他办法?

I have not failed completely
2012-12-16 19:25
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 4楼 神龙赖了
木看清楚,删除。。。

[ 本帖最后由 azzbcc 于 2012-12-16 19:28 编辑 ]


[fly]存在即是合理[/fly]
2012-12-16 19:27
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
明显程序的错误
temp是指针啊,sizeof(temp)只申请了4字节空间,strcpy(ptemp,temp);这能放下?肯定报错了
改成这样char *ptemp = (char*)malloc(sizeof(char)*18);,申请18字节空间

小小战士,战士中的战斗机!
2012-12-16 19:27
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
strlen(temp) + 1


[fly]存在即是合理[/fly]
2012-12-16 19:28
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
temp是个指针变量,strlen(temp)是根据字符的多少作为返回值的,加上终止符1,对的...

I have not failed completely
2012-12-16 19:28
快速回复:发现一个很奇怪的问题...
数据加载中...
 
   



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

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