jiuyuan 发表于 2019-8-12 21:12:19

使用字符数组处理字符串变量

#include <stdio.h>
#include <string.h>
#define MAX_REMIND 50
#define MSG_LEN 60


int main()
{
        char reminders;
        char day_str,msg_str;
        int day={0},i,j=0,num_remind=0,ch,len=0;
        char *p;
       
/*
        for(;;)
        {
                printf("Enter the day and reminder:");
                scanf("%d",&day);
                if(day==0)
                break;
                sprintf(day_str,"%2d",day);
                i=1;
                msg_str=' ';
                while((ch=getchar())!='\n')
                {
                        msg_str=ch;
                       
                }
                msg_str='\0';
                strcat(strcpy(reminders,day_str),msg_str);
                j++;       
        }

*/
       
        for(i=0;i<j;i++)
        {
                p=reminders;
                len++;
        }
        ch=len-1;
        while(ch>=0)
        {
                j=-1;
                for(i=0;i<=ch-1;i++)
                {
                        j=i+1;
                        if(day>day)
                        {
                                p=reminders;
                                p=reminders;
                        }
               
                }
                ch=j;
        }
       
        for(i=0;i<len;i++)
        printf("%s\n",p);
       
        return 0;
       
}


/********************************************************************************************************************************************
我的问题出在(代码里用注释标记的那个for循环)
那部分代码想要实现:输入一个数字,(空格结束数字的输入)。然后是字符串信息(用回车结束)。把这两部分统一保存为字符串保存在二维数组里。
问题来了:只输入一条信息(然后输入数字0,可以退出这个for循环),如果输入2及以上的信息,再输入0,退不出这个循环。
请大家帮我看看,谢谢。

jackz007 发表于 2019-8-12 21:32:24

      你的描述很不清楚,用样例说话,比如,你希望键入什么样的东西时,循环继续,键入什么样的东西时,循环终止?

jiuyuan 发表于 2019-8-12 21:35:05

jackz007 发表于 2019-8-12 21:32
你的描述很不清楚,用样例说话,比如,你希望键入哪些东西继续,键入哪些东西时终止循环。

比如 输入:“12 1234(回车)0”,这样可以退出循环
       输入:“ 12 1234(回车)13 1234(回车)0”,退不出循环

jiuyuan 发表于 2019-8-12 21:36:22

jackz007 发表于 2019-8-12 21:32
你的描述很不清楚,用样例说话,比如,你希望键入什么样的东西时,循环继续,键入什么样的东西时,循 ...

我想要输入多个信息,保存再二维数组里,可以退出这个循环。问题是退不出来

jackz007 发表于 2019-8-12 22:29:34

本帖最后由 jackz007 于 2019-8-12 22:37 编辑

    问题出在你的排序循环上了,就是下面这块代码:
      ch=len-1;
      while(ch>=0)
      {
                j=-1;
                for(i=0;i<=ch-1;i++)
                {
                        j=i+1;
                        if(day>day)
                        {
                              p=reminders;
                              p=reminders;
                        }
               
                }
                ch=j;
      }

      上面的代码在 len > 1 的时候会进入死循环,整体用下面的代码替换就可以了:

      int tx                                                            ;
      char * px                                                         ;
      for(i = 1 ; i < len ; i ++) {
                for(j = i ; j > 0 && day < day ; j --){
                        tx = day                                       ;
                        day = day                                 ;
                        day = tx                                     ;
                        px = p                                           ;
                        p = p                                     ;
                        p = px                                       ;
                }
      }

jiuyuan 发表于 2019-8-12 22:43:51

jackz007 发表于 2019-8-12 22:29
问题出在你的排序循环上了,就是下面这块代码:




感谢。排序问题可以解决了,但是那个for循环好像还有问题。
假设输入数字1234,(我用了sprint函数,应该最后的结果只保留2位的),结果整个数字都保留在day_str数组里了,可能还会超出数组边界。好奇怪啊。

jackz007 发表于 2019-8-12 23:00:10

      继续整体优化,谨供楼主参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_REMIND 50
#define MSG_LEN 60

int main(void)
{
      char reminders                           ;
      char * p , * px                                       ;
      int day = {0} , i , j , len                           ;
      int tx                                                            ;

      for(len = 0 , j = 0 ; j < MAX_REMIND ; j ++ , len ++) {
                printf("Enter the day and reminder : ")                     ;
                fgets(reminders , MSG_LEN + 2 , stdin)                   ;
                reminders) - 1] = '\0'               ;
                sscanf(reminders , "%d" , & day)                      ;
                if (day == 0) break                                    ;
                p = reminders                                       ;
      }
      for(i = 1 ; i < len ; i ++) {
                for(j = i ; j > 0 && day < day ; j --) {
                        tx = day                                       ;
                        day = day                                 ;
                        day = tx                                     ;
                        px = p                                           ;
                        p = p                                     ;
                        p = px                                       ;
                }
      }
      for(i = 0 ; i < len ; i ++) printf("%s\n" , p)                   ;
}

jackz007 发表于 2019-8-12 23:05:09

jiuyuan 发表于 2019-8-12 22:43
感谢。排序问题可以解决了,但是那个for循环好像还有问题。
假设输入数字1234,(我用了sprint函数,应 ...

   难道你希望输入 1234让 day = 12 ?

jiuyuan 发表于 2019-8-12 23:11:21

jackz007 发表于 2019-8-12 23:00
继续整体优化,谨供楼主参考:

你的代码很精简,但是对于新手来说读起来有点困难,我慢慢看吧。
还有一个问题没解决,我首先要输入一个数字,如果大于两位数,我只在reminders里保留前两个字符。我写的for循环里sprintf(day_str,"%2d",day)有什么问题吗?

jiuyuan 发表于 2019-8-12 23:14:00

jackz007 发表于 2019-8-12 23:05
难道你希望输入 1234让 day = 12 ?

不是,day肯定存的是int 的1234,我想把12转化成字符存到day_str里

jackz007 发表于 2019-8-12 23:22:13

本帖最后由 jackz007 于 2019-8-12 23:33 编辑

jiuyuan 发表于 2019-8-12 23:11
你的代码很精简,但是对于新手来说读起来有点困难,我慢慢看吧。
还有一个问题没解决,我首先要输入一个 ...

      如果 day = 1234 的话,sprintf(day_str,"%2d",day),day_str 的内容一定是 '1234' ,在这种情况下,域宽指示符 2 失效,因为要显示的数据位数实际上已经超过了 2 位。'%2d' 只会在要显示的数据不超过 2 位数的时候才有意义,如果超出就会失效。

      如果你一定好取前 2 位的话,这么操作:
      tx = day               ;
      while(tx > 99) tx /= 10   ;
      sprintf(day_str,"%2d",tx) ;

jiuyuan 发表于 2019-8-12 23:29:34

jackz007 发表于 2019-8-12 23:22
如果 day = 1234 的话,sprintf(day_str,"%2d",day),day_str 的内容一定是 '1234' ,在这 ...

好的,我知道了,我再想想办法存字符时只保留两位。

jackz007 发表于 2019-8-12 23:32:02

jiuyuan 发表于 2019-8-12 23:29
好的,我知道了,我再想想办法存字符时只保留两位。

    我已经为你想出了办法,还是在 11 楼

jiuyuan 发表于 2019-8-12 23:44:30

jackz007 发表于 2019-8-12 23:32
我已经为你想出了办法,还是在 11 楼

老哥,我要吐血了。
没看到你这个方法前,我打算用前几天(你刚帮我解决了一点疑惑)刚学的那个字节表示的方法提取数字,再转换ASCII。
你的这个方法我用了,它不生效啊。看起来时day的前两位数存到tx,再把tx存到day_str,但是我还是把day,所有位数的存到reminders里了。我有点晕。

jackz007 发表于 2019-8-12 23:53:57

jiuyuan 发表于 2019-8-12 23:44
老哥,我要吐血了。
没看到你这个方法前,我打算用前几天(你刚帮我解决了一点疑惑)刚学的那个字节表示 ...

      把你代码里的这一块代码:
                sprintf(day_str,"%2d",day);
                i=1;
                msg_str=' ';
                while((ch=getchar())!='\n')
                {
                        msg_str=ch;
                        
                }
                msg_str='\0';
                strcat(strcpy(reminders,day_str),msg_str);

      整体用下面的代码替换,我就不相信不起效!

                while(day > 99) day /= 10                  ;
                sprintf(day_str , "%2d", day)                   ;
                i = 0                                              ;
                msg_str = ' '                              ;
                while((ch = getchar()) != '\n') msg_str = ch ;
                msg_str='\0'                                    ;
                strcat(strcpy(reminders , day_str) , msg_str)   ;

jiuyuan 发表于 2019-8-13 00:04:03

jackz007 发表于 2019-8-12 23:53
把你代码里的这一块代码:




老哥,还是有问题啊。我全用的你的代码,排序部分也是。
我输入1234,然后输出是“?”和后面的字符。
你看看我提取int字节里的值,然后转化成字符,输出也是最前面是“?”。我也重写了那个排序部分,现在我写的这个和全用你的代码问题一样了。
#include <stdio.h>
#include <string.h>
#define MAX_REMIND 50
#define MSG_LEN 60

typedef unsigned char * pointer;

int main()
{
        char reminders={0};
        char day_str={0},msg_str;
        int day={0},i,j=0,num_remind=0,ch,len=0;
        char *p;
       
       
        for(;;)
        {
                printf("Enter the day and reminder:");
                scanf("%d",&day);
                unsigned char *q;
                q=(pointer)&day;
                if(day==0)
                break;
                //sprintf(day_str,"%2d",day);
                day_str=(*q++)+30;
                day_str=(*q)+30;
                day_str='\0';
                i=1;
                msg_str=' ';
                while((ch=getchar())!='\n')
                {
                        msg_str=ch;
                       
                }
                msg_str='\0';
                strcat(strcpy(reminders,day_str),msg_str);
                j++;       
        }
       
        for(i=0;i<j;i++)
        {
                p=reminders;
                len++;
        }
        ch=len-1;
        while(ch>=0)
        {
                j=-1;
                for(i=1;i<=ch;i++)
                {
                       
                        if(day>day)
                        {
                                j=i-1;
                                p=reminders;
                                p=reminders;
                        }
               
                }
                ch=j;
        }
       
        for(i=0;i<len;i++)
        printf("%s\n",p);
       
        return 0;
       
}

jiuyuan 发表于 2019-8-13 00:05:39

jiuyuan 发表于 2019-8-13 00:04
老哥,还是有问题啊。我全用的你的代码,排序部分也是。
我输入1234,然后输出是“?”和后面的字符。
...

30那个地方应该是48,

jiuyuan 发表于 2019-8-13 00:12:33

jackz007 发表于 2019-8-12 23:53
把你代码里的这一块代码:




我突然想到,我输入的是十进制,计算机内部保存为二进制。然后我再直接提取int字节的值,又转换成十进制,好像不是我想要的十进制的值。比如1234,提取第一个字节的值应该不是1.
好心累,明天再看吧,老哥早点休息。我也要睡了。

jackz007 发表于 2019-8-13 00:18:51

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

#define MAX_REMIND 50
#define MSG_LEN 60

int main(void)
{
      char reminders                           ;
      char day_str , msg_str                              ;
      int day={0} , i , j = 0 , num_remind = 0 , ch , len = 0 ;
      int tx                                                            ;
      char * p , * px                                       ;

      for(;;) {
                printf("Enter the day and reminder : ")                     ;
                scanf("%d" , & day)                                    ;
                if(day == 0) break                                       ;
                while(day > 99) day /= 10                           ;
                sprintf(day_str , "%2d" , day)                           ;
                i = 0                                                       ;
                msg_str = '\0'                                           ;
                while((ch = getchar()) != '\n') msg_str = ch          ;
                msg_str= '\0'                                          ;
                strcat(strcpy(reminders , day_str) , msg_str)            ;
                j ++                                                      ;      
      }
      for(i = 0 ; i < j ; i ++) {
                p = reminders                                       ;
                len ++                                                      ;
      }
      for(i = 1 ; i < len ; i ++) {
                for(j = i ; j > 0 && day < day ; j --) {
                        tx = day                                       ;
                        day = day                                 ;
                        day = tx                                     ;
                        px = p                                           ;
                        p = p                                     ;
                        p = px                                       ;
                }
      }
      for(i = 0 ; i < len ; i ++) printf("%s\n" , p)                   ;
}


      你是怎么弄的,看看我这里的运行实况:

C:\Bin>g++ -o x2 x2.c

C:\Bin>x2
Enter the day and reminder : 13 1234
Enter the day and reminder : 12 1234
Enter the day and reminder : 11 1234
Enter the day and reminder : 1588 1234
Enter the day and reminder : 1789 1234
Enter the day and reminder : 19870 1234
Enter the day and reminder : 291876 1234
Enter the day and reminder : 5 1234
Enter the day and reminder : 2 1234
Enter the day and reminder : 0
2 1234
5 1234
11 1234
12 1234
13 1234
15 1234
17 1234
19 1234
29 1234

C:\Bin>

jiuyuan 发表于 2019-8-13 07:11:04

本帖最后由 jiuyuan 于 2019-8-13 07:12 编辑

jackz007 发表于 2019-8-13 00:18
你是怎么弄的,看看我这里的运行实况:

这。。。
我刚才复制了你的代码,又运行了一下,结果是乱码。我用的DevC++这个编译器。我再研究一下http://m.qpic.cn/psb?/V13pezsi3OMnw9/THIS*tW7xlfoAyhUZDTo0iAMkc2lftx9L5ExlPM3Yvk!/b/dMUAAAAAAAAA&bo=VQUAA1UFAAMDCSw!&rf=viewer_4
页: [1] 2
查看完整版本: 使用字符数组处理字符串变量