| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3514 人关注过本帖
标题:编写程序~把输入中的制表符替换成星号 ~ 的疑惑,求解~
只看楼主 加入收藏
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:7 
编写程序~把输入中的制表符替换成星号 ~ 的疑惑,求解~
程序代码是这样的~

程序代码:
/* 把输入字符串中的制表符替换为*号 */ 



/*

 * 原始练习题目:

 * 编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方

 * 假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。

 * n应该昨晚变量还是符合常量呢?

 */

#include <stdio.h>

#define TAB 8

int jis(int i, int tab);

int main(void)
{
        int pos, c, x;
        pos = 0;                        /* 记录当前所在列 */
        while ( (c=getchar()) != EOF ) {
                //++pos;                /* 为啥,把记录列数的表达式放这就会出错,逻辑上讲每录入一个字符就加1和放在后面没有什么区别 */
                if(c == '\t') {
                        x = jis(pos, TAB);
                        while( x > 0) {
                                putchar('*');
                                ++pos;          /* 在每次输出后增加列数就正确了 */
                                --x;
                        }
                }
                else {
                        putchar(c);
                        ++pos;                  /* 要把表达式放这,否则会出现错误~我也不理解 */
                }
        }
}

/* 计算当前列离下一个tab还有几列 */
int jis(int i, int tab)
{
        int x;

        if (i < tab) {
                x = tab - i;
        }
        else if (i > tab) {
                x = i % tab;
                x = tab - x;
        }

        return x;
}


疑惑:
    为啥,不可以在录入字符后就给变量自加1,在哪里自加1,程序输出的星号就对不上?


[此贴子已经被作者于2016-8-3 18:22编辑过]

搜索更多相关主题的帖子: 制表符 编写程序 
2016-08-03 17:22
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
Sorry,完全看不懂楼主的程序意图是什么,输出星号的规则是什么?jis()函数计算的好像是星号个数
图片附件: 游客没有浏览图片的权限,请 登录注册

或者楼主可以把这个程序要解决的问题讲讲,或许能有助于理解题意哦

φ(゜▽゜*)♪
2016-08-03 17:48
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
收藏
得分:0 
回复 2楼 书生牛犊
它的题目是这样的~
/*
 * 编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方
 * 假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。
 * n应该昨晚变量还是符合常量呢?
 */

我把空格改成制表符这样比较看的出效果

电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-08-03 18:18
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 3楼 Man丶諦
还是不懂,效果是不是像这样?
1***2***3
12**2**14
132*2***3
为了实现右对齐?
不对应该不是,就这效果的话哪里用的着专门写个函数
scanf(“%d”,&a);printf("%8d",a);就有了
你给个示例呗,最好足够长,表达充分些


[此贴子已经被作者于2016-8-3 18:42编辑过]


φ(゜▽゜*)♪
2016-08-03 18:39
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
收藏
得分:0 
回复 4楼 书生牛犊
这样的,输入一串字符串,把字符串里的制表符替换为*号  

图片附件: 游客没有浏览图片的权限,请 登录注册


上面的是输入,下面是输出~

程序代码:
#include <stdio.h>

#define TABINC 8

main()
{
        int c, nb, pos;

        nb = 0;                 /* 到下一个制表符有多少列 */
        pos = 0;                /* 目前所在列数 */
        while ((c=getchar()) != EOF) {
                if (c ==  '\t') {
                        nb = TABINC - pos % TABINC;   /* 制表符数 - 当前列数 % 制表符数 */
                        while (nb > 0) {
                                putchar('*');
                                ++pos;
                                --nb;
                        }
                } else if (c == '\n') {                 /* 在遇到换行符后,把列数清零 */
                        putchar(c);
                        pos = 0;
                } else {
                        putchar(c);                     /* 输入普通字符 给列数加一 */
                        ++pos;
                }
        }
}


这是练习题的答案~



[此贴子已经被作者于2016-8-3 19:12编辑过]


电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-08-03 19:02
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
收藏
得分:0 
回复 4楼 书生牛犊
就是把输入字符串  中的   制表符   替换成   星号*  ~

电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-08-03 19:08
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:10 
试一下我这个
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
#include <stdio.h>

#define TAB 8



int main(void) {
    int pos, c, x;
    pos = 0;                        /* 记录当前所在列 */
    while ( (c=getchar()) != EOF ) {
        //++pos;                /* 为啥,把记录列数的表达式放这就会出错,逻辑上讲每录入一个字符就加1和放在后面没有什么区别 */
                                /***有区别,因为不管读进来的字符是不是制表符他都加一*/
        if(c == '\t') {
            for(int i=0;i<(TAB-pos%TAB);i++)printf("*");
            pos=0;//更正一下,这行不能省。pos必须要变!
        } else {
            putchar(c);
            ++pos;                  /* 要把表达式放这,否则会出现错误~我也不理解 */
        }
    }
}




[此贴子已经被作者于2016-8-3 19:42编辑过]


φ(゜▽゜*)♪
2016-08-03 19:38
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
收藏
得分:0 
回复 7楼 书生牛犊
理解了~原来是这样~
    还没有判断就开始记录字符数,就吧任何的输入都记录了~   
    所以后面计算就出错了~

谢谢~


电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-08-03 19:45
快速回复:编写程序~把输入中的制表符替换成星号 ~ 的疑惑,求解~
数据加载中...
 
   



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

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