VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 928|回复: 6

puts()的迷惑

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-9-28 19:00:01 | 显示全部楼层 |阅读模式
#include<stdio.h>
char *read(char *p,int n);
int main(void)
{
        char s[10];
        char *p;
        int q;
        p=read(s,10);
           return 0;
}

char *read(char *p,int n)
{
        int m=n;
   
        while(n--)
                {p[m-n]=getchar();
             printf ("%c",p[m-n]);}//打印1
                 printf ("\n");
                 puts(p);//打印2

                  return p;
}
这样的一个函数,用打印1语句没问题,为什么用puts()就有问题了,显示乱码?难道puts()一定要和gets()一起用吗?
回复

使用道具 举报

2

主题

20

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-9-28 22:45:01 | 显示全部楼层
C里面规定字符串的结束符是'\0',而你的程序里字符串数组的所有元素均为由getchar输入的字符,系统找不到'\0'就会认为字符串未结束,所以就有了乱码.你可以看一下乱码的前几位字符是否是正确的.
回复

使用道具 举报

0

主题

63

帖子

43.00

积分

新手上路

Rank: 1

积分
43.00
发表于 2020-9-29 07:30:01 | 显示全部楼层
read()前memset(s, 0, sizeof(s));
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-9-29 07:45:01 | 显示全部楼层
试下看行不?
#include<stdio.h>
#include<stdlib.h>
char *read(char *p,int n);
int main(void)
{
        char s[10];
        char *p;
//        int q;
        p=read(s,10);
        puts(p);
         printf ("\n");
         system( "pause" );
         return 0;
}

char *read(char *p,int n)
{
//        int m=n;
         char *q=p;
        while(n--)
        {
//                p[m-n]=getchar();
                *p = getchar();
                p++;
//          printf ("%c",p[m-n]); //打印1
        }
        *p = '\0';
//        puts(p);       
//        printf ("\n");
//                puts(p);                                                        //打印2

   return q;
}
回复

使用道具 举报

2

主题

20

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-9-29 09:30:01 | 显示全部楼层
不对,p是数组的首地址,怎么能让p随便++呢.
只要在你的第1个程序里,在read函数里让p[9] = '\0'就行了
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-9-30 00:00:01 | 显示全部楼层
不对,p是数组的首地址,怎么能让p随便++呢.
_______________________________________________________________
看清楚再说..

只要在你的第1个程序里,在read函数里让p[9] = '\0'就行了
________________________________________________________________
先运行输入10个字符看下结果再说..
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-9-30 08:00:01 | 显示全部楼层
#include<stdio.h>
char *read(char *p,int n);
int main(void)
{
char s[11];
s[10]='\0';//我的LCC不支持直接定义的说。。麻烦。。
           //PS:我以为未定义就是空字符。。弄错了。。抱歉
char *p;
p=read(s,10);
puts(p);
   return 0;
}

char *read(char *p,int n)
{
int m=n;

while(n--)
{p[m-n-1]=getchar();}//这里应该是m-n-1
     //printf ("%c",p[m-n]);}//打印1
//printf ("\n");
//puts(p);//打印2

          return p;
}
两处错误。。修改就OK了。。
谢谢大家了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表