使用字符数组处理字符串变量
#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
你的描述很不清楚,用样例说话,比如,你希望键入哪些东西继续,键入哪些东西时终止循环。
比如 输入:“12 1234(回车)0”,这样可以退出循环
输入:“ 12 1234(回车)13 1234(回车)0”,退不出循环 jackz007 发表于 2019-8-12 21:32
你的描述很不清楚,用样例说话,比如,你希望键入什么样的东西时,循环继续,键入什么样的东西时,循 ...
我想要输入多个信息,保存再二维数组里,可以退出这个循环。问题是退不出来 本帖最后由 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 ;
}
} jackz007 发表于 2019-8-12 22:29
问题出在你的排序循环上了,就是下面这块代码:
感谢。排序问题可以解决了,但是那个for循环好像还有问题。
假设输入数字1234,(我用了sprint函数,应该最后的结果只保留2位的),结果整个数字都保留在day_str数组里了,可能还会超出数组边界。好奇怪啊。 继续整体优化,谨供楼主参考:
#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) ;
} jiuyuan 发表于 2019-8-12 22:43
感谢。排序问题可以解决了,但是那个for循环好像还有问题。
假设输入数字1234,(我用了sprint函数,应 ...
难道你希望输入 1234让 day = 12 ? jackz007 发表于 2019-8-12 23:00
继续整体优化,谨供楼主参考:
你的代码很精简,但是对于新手来说读起来有点困难,我慢慢看吧。
还有一个问题没解决,我首先要输入一个数字,如果大于两位数,我只在reminders里保留前两个字符。我写的for循环里sprintf(day_str,"%2d",day)有什么问题吗? jackz007 发表于 2019-8-12 23:05
难道你希望输入 1234让 day = 12 ?
不是,day肯定存的是int 的1234,我想把12转化成字符存到day_str里 本帖最后由 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) ; jackz007 发表于 2019-8-12 23:22
如果 day = 1234 的话,sprintf(day_str,"%2d",day),day_str 的内容一定是 '1234' ,在这 ...
好的,我知道了,我再想想办法存字符时只保留两位。 jiuyuan 发表于 2019-8-12 23:29
好的,我知道了,我再想想办法存字符时只保留两位。
我已经为你想出了办法,还是在 11 楼 jackz007 发表于 2019-8-12 23:32
我已经为你想出了办法,还是在 11 楼
老哥,我要吐血了。
没看到你这个方法前,我打算用前几天(你刚帮我解决了一点疑惑)刚学的那个字节表示的方法提取数字,再转换ASCII。
你的这个方法我用了,它不生效啊。看起来时day的前两位数存到tx,再把tx存到day_str,但是我还是把day,所有位数的存到reminders里了。我有点晕。 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) ;
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:04
老哥,还是有问题啊。我全用的你的代码,排序部分也是。
我输入1234,然后输出是“?”和后面的字符。
...
30那个地方应该是48, jackz007 发表于 2019-8-12 23:53
把你代码里的这一块代码:
我突然想到,我输入的是十进制,计算机内部保存为二进制。然后我再直接提取int字节的值,又转换成十进制,好像不是我想要的十进制的值。比如1234,提取第一个字节的值应该不是1.
好心累,明天再看吧,老哥早点休息。我也要睡了。 #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: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