mxwawaawxm 发表于 2019-11-3 17:53

为什么这串c代码里的字符串无法显示

本帖最后由 mxwawaawxm 于 2019-11-5 21:51 编辑

源自这道题

我写的代码
我的想法是由用户输入字符串、显示的时间、消失的时间、重复次数
但是实际运行过程,printf("\r第%d次--%s", i+1, string);字符串没显示,哪里错了。请问{:301_1009:}
#include <stdio.h>
#include <time.h>
#include <string.h>

#define LEN 128
int sleep(unsigned long millisecond);
void bput(const char *string, int display_ms, int disappear_ms, int cnt);

int main(int argc, char *argv[])
{
      char string;
      int display_ms;
      int disappear_ms;
      int cnt;
      
      printf("请依次输入字符串、显示时间,消失时间,次数--");
      scanf("%s %d %d %d", string, &disappear_ms, &disappear_ms, &cnt);
      
      bput(string, display_ms, disappear_ms, cnt);

      
      return 0;
}

int sleep(unsigned long millisecond)
{
      clock_t start=clock(), end;
      
      do {
                if ((end=clock())==(clock_t)-1) {
                        return 0;
                }
      } while ((end-start)*1000.0/CLOCKS_PER_SEC < millisecond);
      
      return 1;
}

void bput(const char *string, int display_ms, int disappear_ms, int cnt)
{
      int i;
      int length=strlen(string);
      
      for (i=0;i<cnt;i++) {
                printf("\r第%d次--%s", i+1, string);
                fflush(stdout);
                sleep(display_ms);
                printf("\r第%d次--%*s", i+1, length, " ");
                fflush(stdout);
                sleep(disappear_ms);
      }
      printf("\n%s\n", string);

}

为什么字符串无法显示

庸人误我 发表于 2019-11-3 18:44

#include <stdio.h>
#include <time.h>
#include <string.h>

#define LEN 128
int sleep(unsigned long millisecond);
void bput(const char *string, int display_ms, int disappear_ms, int cnt);

int main(int argc, char *argv[])
{
    char string;
   int display_ms;
   int disappear_ms;
    int cnt;
    printf("请依次输入字符串、显示时间,消失时间,次数--\n");
    scanf("%s %d %d %d", string, &display_ms, &disappear_ms, &cnt);
    bput(string, display_ms, disappear_ms, cnt);


    return 0;
}

int sleep(unsigned long millisecond)
{
    clock_t start=clock(), end;

    do {
      if ((end=clock())==(clock_t)-1) {
            return 0;
      }
    } while ((end-start)*1000.0/CLOCKS_PER_SEC < millisecond);

    return 1;
}

void bput(const char *string, int display_ms, int disappear_ms, int cnt)
{
    int i;
   int length=strlen(string);

    for (i=0;i<=cnt;i++) {
      printf("\r第%d次--%s", i+1, string);
      fflush(stdout);
      sleep(display_ms);
      printf("\r第%d次--%*s", i+1, length, " ");
      fflush(stdout);
      sleep(disappear_ms);
    }

}



你的scanf接收了两个相同的值disappear_ms吧

mxwawaawxm 发表于 2019-11-4 20:57

本帖最后由 mxwawaawxm 于 2019-11-4 20:59 编辑

能否再帮我看看@庸人误我
我想实现以下功能
用户输入字符串、显示的时间、消失的时间、重复次数
然后显示时间除以字符串长度,得到每个字符的显示时间,依次显示每个字符
而后消失时间除以字符串长度,得到每个字符的消失时间,依次消失每个字符

我的代码如下
结果出现,在显示字符串时,不是依次显示每个字符,而是整个出来。而且不能显示最后一个字符,哪里出错了{:301_1007:}

#include <stdio.h>
#include <time.h>
#include <string.h>

#define LEN 128
int sleep(unsigned long millisecond);
void flicker_str(char *string, int display_ms, int disappear_ms, int cnt);
void display_one_by_one(char *string, int display_ms, int length);
void disappear_one_by_one(char *string, int disappear_ms, int length);

int main(int argc, char *argv[])
{
      char string;
      int display_ms;
      int disappear_ms;
      int cnt;
      
      printf("请依次输入字符串、显示时间,消失时间,次数--");
      scanf("%s %d %d %d", string, &disappear_ms, &disappear_ms, &cnt);
      
      /*字符串闪烁显示*/
      /*隔特定时间依次显示每个字符,而后隔特定时间消去每个字符*/
      flicker_str(string, display_ms, disappear_ms, cnt);
      
      return 0;
}

/*暂停多少秒*/
int sleep(unsigned long millisecond)
{
      clock_t start=clock(), end;
      
      do {
                if ((end=clock())==(clock_t)-1) {
                        return 0;
                }
      } while ((end-start)*1000.0/CLOCKS_PER_SEC < millisecond);
      
      return 1;
}

void flicker_str(char *string, int display_ms, int disappear_ms, int cnt)
{
      int length=strlen(string);
      int i=0;
      
      for (;i<cnt;i++) {
                /*隔特定时间依次显示每个字符*/
                display_one_by_one(string, display_ms, length);
                /*隔特定时间消去每个字符*/
                disappear_one_by_one(string, disappear_ms, length);
      }
      
      printf("%s\n", string);
}

/*隔特定时间依次显示每个字符*/
void display_one_by_one(char *string, int display_ms, int length)
{
      /*将显示时间除以字符串长度,获得每个字符的显示速度*/
      int display_ms_one=display_ms/length;
      
      while (*string!='\0') {
                printf("%c", *string++);
                fflush(stdout);
                sleep(display_ms_one);
      }
}

/*隔特定时间消去每个字符*/
void disappear_one_by_one(char *string, int disappear_ms, int length)
{
      /*将消失时间除以字符串长度,获得每个字符的消失速度*/
      int disappear_ms_one=disappear_ms/length;
      int i=0;
      
      for (;i<length;i++) {
                printf("\b \b");
                fflush(stdout);
                sleep(disappear_ms_one);
      }
}

庸人误我 发表于 2019-11-5 13:04

本帖最后由 庸人误我 于 2019-11-5 13:20 编辑

#include <stdio.h>
#include <time.h>
#include <string.h>

#define LEN 128
int sleep(unsigned long millisecond);
void bput(const char *string, int display_ms, int disappear_ms, int cnt);
void display_one_by_one(char *string, int display_ms, int length);
void disappear_one_by_one(char *string, int disappear_ms, int length);

int main(int argc, char *argv[])
{
    char string;
    int display_ms;
    int disappear_ms;
    int cnt;
    printf("请依次输入字符串、显示时间,消失时间,次数--\n");
    scanf("%s %d %d %d", string, &display_ms, &disappear_ms, &cnt);
    bput(string, display_ms, disappear_ms, cnt);
   
   
    return 0;
}

int sleep(unsigned long millisecond)
{
    clock_t start=clock(), end;
   
    do {
      if ((end=clock())==(clock_t)-1) {
            return 0;
      }
    } while ((end-start)*1000.0/CLOCKS_PER_SEC < millisecond);
   
    return 1;
}

void bput(const char *string, int display_ms, int disappear_ms, int cnt)
{
    int i;
    int length=strlen(string);
   
    for (i=0; i<cnt; i++) {
      display_one_by_one(string,display_ms,length);
      disappear_one_by_one(string,disappear_ms,length);
    }
   
}
/*隔特定时间依次显示每个字符*/
void display_one_by_one(char *string, int display_ms, int length)
{
    /*将显示时间除以字符串长度,获得每个字符的显示速度*/
    int display_ms_one=display_ms/length;
   
    while (*string!='\0') {
      printf("%c", *string++);
      fflush(stdout);
      sleep(display_ms_one);
    }
}

/*隔特定时间消去每个字符*/
void disappear_one_by_one(char *string, int disappear_ms, int length)
{
    /*将消失时间除以字符串长度,获得每个字符的消失速度*/
    int disappear_ms_one=disappear_ms/length;
    int i=0;
   
    for (;i<=length;i++) {
      printf("\b \b");
      fflush(stdout);
      sleep(disappear_ms_one);
    }
}



你看下是这样子的吗?没得录动态图的软件,你函数都写好了,调用就可以了呀!有个小错就是显示字符时的for循环i<=length.否则会少打印一个字符

mxwawaawxm 发表于 2019-11-5 21:04

本帖最后由 mxwawaawxm 于 2019-11-5 21:06 编辑

谢谢。直接按你的代码,除了一些错误提示,大致可以了@庸人误我

错误提示

不过,你提到的,是说这里吗
有个小错就是显示字符时的for循环i<=length.否则会少打印一个字符
void disappear_one_by_one(char *string, int disappear_ms, int length)
{
    /*将消失时间除以字符串长度,获得每个字符的消失速度*/
    int disappear_ms_one=disappear_ms/length;
    int i=0;
   
    for (;i<length;i++) {
      printf("\b \b");
      fflush(stdout);
      sleep(disappear_ms_one);
    }

我把等于去掉,没影响结果。这应该不用加等号

不过很奇怪的是,我发现你给的代码,大部分也是调用我写的函数,但是我源代码显示出来的结果就跟你不一样
显示字符串时,是一次性显示,而且少了最后一个字符,但消去字符时,倒是正常,一个个消去

我始终不明白我的代码错在哪里{:301_1009:}你能运行我的代码看看吗{:301_1007:}
#include <stdio.h>
#include <time.h>
#include <string.h>

#define LEN 128
int sleep(unsigned long millisecond);
void flicker_str(char *string, int display_ms, int disappear_ms, int cnt);
void display_one_by_one(char *string, int display_ms, int length);
void disappear_one_by_one(int disappear_ms, int length);

int main(int argc, char *argv[])
{
      char string;
      int display_ms;
      int disappear_ms;
      int cnt;
         
      printf("请依次输入字符串、显示时间,消失时间,次数--");
      scanf("%s %d %d %d", string, &disappear_ms, &disappear_ms, &cnt);
         
      /*字符串闪烁显示*/
      /*隔特定时间依次显示每个字符,而后隔特定时间消去每个字符*/
      flicker_str(string, display_ms, disappear_ms, cnt);
         
      return 0;
}

/*暂停多少秒*/
int sleep(unsigned long millisecond)
{
      clock_t start=clock(), end;
         
      do {
                if ((end=clock())==(clock_t)-1) {
                        return 0;
                }
      } while ((end-start)*1000.0/CLOCKS_PER_SEC < millisecond);
         
      return 1;
}

void flicker_str(char *string, int display_ms, int disappear_ms, int cnt)
{
      int length=strlen(string);
      int i=0;
         
      for (i=0;i<cnt;i++) {
                /*隔特定时间依次显示每个字符*/
                display_one_by_one(string, display_ms, length);
                /*隔特定时间消去每个字符*/
                disappear_one_by_one(disappear_ms, length);
      }
         
      printf("%s\n", string);
}

/*隔特定时间依次显示每个字符*/
void display_one_by_one(char *string, int display_ms, int length)
{
      /*将显示时间除以字符串长度,获得每个字符的显示速度*/
      int display_ms_one=display_ms/length;
         
      while (*string!='\0') {
                printf("%c", *string++);
                fflush(stdout);
                sleep(display_ms_one);
      }
}

/*隔特定时间消去每个字符*/
void disappear_one_by_one(int disappear_ms, int length)
{
      /*将消失时间除以字符串长度,获得每个字符的消失速度*/
      int disappear_ms_one=disappear_ms/length;
      int i=0;
         
      for (;i<=length;i++) {
                printf("\b \b");
                fflush(stdout);
                sleep(disappear_ms_one);
      }
}

庸人误我 发表于 2019-11-5 21:36

你看一下第一次的回帖吧!大哥,你的display_ms没有赋值的,disappear_ms接收了两次

mxwawaawxm 发表于 2019-11-5 21:50

庸人误我 发表于 2019-11-5 21:36
你看一下第一次的回帖吧!大哥,你的display_ms没有赋值的,disappear_ms接收了两次

居然又犯了如此低端的错误{:301_1008:},谢谢。
页: [1]
查看完整版本: 为什么这串c代码里的字符串无法显示