注:文章内容来源于网络,真实性有待确认,请自行甄别。
C语言高手进!急!下面程序的功能是将无符号八进制数字构成的字符串
发表于:2024-10-24 00:00:00浏览:7次
问题描述:下面的功能是将无符号八进制数字构成的字符串转换成十六进制的帧数。
#include "stdio.h"
void main()
{
char *p,s[6]={123456};
int n;
p=s;
gets(p);
n=*p-'0';
while(*++p='\0')
n=n*8+*p-'\0';
printf("%d\n",n);
}
请问倒数第三行为什么是*++p,而不是*p或*p++?
抛开你的目的,就你本身这段程序来说,问题不少。
第四行char *p,s[6]={123456};这一句定义有错,应该是
char *p,s[7]={"123456"};
或char *p,s[]={"123456"};
赋值字符数组时要加双引号,而且末尾还有一个'\0'字符的,所以要注意数组的下标。
第七行gets(p)会出问题的,因为gets是从p所指向的地址的下一个位置开始写入,p当前所指向的地址的当前的值没有改变,这会在处理的时候出问题
倒数第三行while(*++p='\0')?赋值语句作为while的循环条件。。。这种事情很让我无语。。。应该是while(*++p!='\0') 或 while(*++p=='\0') 吧。
(PS:本来想写评论的,但是怕字数限制写不够。你这八进制转十六进制的算法看起来不大像,建议重新研究下算法)
(补充一下,回答你的问题)
倒数第三行为什么是*++p,而不是*p或*p++?
如果是while(*++p!='\0') 或 while(*++p=='\0')的话,*++p表示*(++p),即p所指向的下一个地址内的值,其中前置++符号会优先处理的,处理完*++p后再执行!=或==操作;如果是*p,p的值和p地址的值在循环中没有变化,那就会陷入死循环;而如果是*p++,后置++符号会在==符号处理或!=符号处理之后,那么代码的执行过程相当于这样:*p=='\0'或*p!='\0'后再执行p++,这样的话如果p刚好处于字符串末尾,p++操作就会造成溢出,代码也就不安全了。
栏目分类全部>