鱼C论坛

 找回密码
 立即注册
查看: 828|回复: 1

[已解决]最后s[i] = '\0'时不就覆盖了最后一个数吗

[复制链接]
发表于 2020-2-4 09:34:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <ctype.h>

int getop(char s[])
{
        int i,c;
       
        while((s[0] = c = getch()) == ' ' || c == '\t')
                ;
        s[1] = '\0';
        if(!isdigit(c) && c != '.')
                return c;
        i = 0;
        if(isdigit(c))
                while(isdigit(s[++i] = c = getch()))
                        ;
        if(c == '.')
                while(isdigit(s[++i] = c = getch()))
                        ;
        s[i] = '\0';       /* 上面一行是++i因此i是最后一个数并不是赋值了以后再+1,但是这里的s[i]='\0'不就把最后一个字符赋值成了终止符吗 */
        if(c != EOF)
                ungetch(c);
        return NUMBER;
}
/* 谢谢解答 */
最佳答案
2020-2-4 12:52:00
首先,整体来看,数组s应该是想获取输入内容中的0~9的数字(下列统称十进制数),
                while(isdigit(s[++i] = c = getch()))
                        ;
注意这个while循环的跳出条件,当它跳出的时候,就是isdigit()返回0(即获取的内容为非十进制数)。
函数传参的表达式先执行,即s[++i] = c = getch()已经被执行了,此时s数组最后一个存储的内容是一个非十进制数,这不是我们想要的十进制数,所以下一句
s[i] = '\0'; 覆盖的内容不是我们想要的十进制数。
因此没问题。

如果猜错,欢迎指出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-4 12:52:00 | 显示全部楼层    本楼为最佳答案   
首先,整体来看,数组s应该是想获取输入内容中的0~9的数字(下列统称十进制数),
                while(isdigit(s[++i] = c = getch()))
                        ;
注意这个while循环的跳出条件,当它跳出的时候,就是isdigit()返回0(即获取的内容为非十进制数)。
函数传参的表达式先执行,即s[++i] = c = getch()已经被执行了,此时s数组最后一个存储的内容是一个非十进制数,这不是我们想要的十进制数,所以下一句
s[i] = '\0'; 覆盖的内容不是我们想要的十进制数。
因此没问题。

如果猜错,欢迎指出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-14 13:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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