c语言键盘输入字符串中在键盘上输入了一字符或对应的ASC||码,在c语言键盘输入字符串中如何区别出来

c语言中定义一个字符数组,其中存放的是什么_百度知道
c语言中定义一个字符数组,其中存放的是什么
在C语言中,字符数组中存放的内容中字符的ASC码。如果在定义过程中没有赋初值,则数组中的元素都为0。如
char c[10];
定义了c是一个字符数组共有10个元素c[0]、c[1]……c[9],因为没有赋初值,所以这10个元素的值都是0。
如果定义时赋了初值,或在程序中赋元素的值,则该元素保存对应字符的ASC码值。如:
char c[10]=&ABCD&;
//'A'的ASC码是65
//'B'的ASC码是66
//'C'的ASC码是67
//'D'的ASC码是68
在程序中,a[0]='A'和a[0]=65是等价的。验证:
char a[10]=&ABCD&;
printf(&%d
%c\n&,a[0],a[0]);
//输出65
printf(&%d
%c\n&,a[3],a[3]);
//输出68
printf(&%d
%c\n&,a[3],a[3]);
//输出65
printf(&%d&,a[6]);
// 输出0
因为没有赋a[6]初值,所以其值为0
其他类似问题
为您推荐:
提问者采纳
你定义的char a[60],因为数组是从a[0]开始计算的 如果你没有赋值 那么默认的是全是0 也就是全是空格 以内你定义的是字符型。 ‘\0’是系统给你加的 它的位置是a[60]的60个元素的后面 不占用你定义的60个元素 你定义的是字符数组 不是int 行数组 char定义的是放字符 字符串的
提问者评价
感谢大家的答问,学到了不少东西
其他7条回答
0&quot,而数组却不同;\0&quot,否则就会出错,你的字母个数必需小于60.如果小于60:你用字符串赋值的话后面系统就会自动加&quot,你可以正好等于60;,则后面当然是0了简单一点说,系统会自动加&0&quot这个问题是你把数组与字符串搞混了;,也就是说最后一个数字不一定等于&quot,数组赋值后面是不自加& 比方说char[60]=&\\0&quot,如果小于60的话;\;i a m&quot,你用字符串赋值的话;的;
自己试一下就知道了,先定义一个字符数组(不初始化),用gets函数输出,如果什么也没有就说明未初始化时全部赋'\0',如果是乱码就说明是随机值。部分初始化我知道,后面未被赋值的部分自动赋'\0'
总体来说,数组未初始化之前都是不可知的,如果强行输出时会是乱码。对于字符型数组,只要定义个数小于等于定义的个数,它都会自动加/0。对于整型数组,不会加/0。
在c/c++中,数组是指 连续分布的内存单元。字符串是一种字符数组,比其他数组特殊的地方是如果数组被赋值(scanf,fread,fprintf,strcpy,nstrcpy)会在数组末尾追加'\0'.在c语言中,数组大小是不可知的。(strlen(s)只能算出从s开始到'\0'的长度)
全部都是随机值
存放的字符呀
c语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁C语言中利用qsort函数对字符串数组按ASC||码进行排序并输出、_百度知道
C语言中利用qsort函数对字符串数组按ASC||码进行排序并输出、
}int comp(const void *p,const void *).h&i&//%s\,const void *q){
return -strcmp(*(char **)p,*(char **)q).h&#include&
for(i=0;输入部分
qsort(%s&quot.h&输出
getch();;int comp(const void *;
return 0;&#47,name[i]);5;i&lt,sizeof(name[0]);i++)
printf(&i++)
scanf(&/5个人的名字5;/n&/stdlib,name[i]).h&#include&/&#47,comp);int main(){
char name[5][20];#include&lt,5;排序
for(i=0结果不对、求解释~#include&lt
,(char *)q);&#47int comp(const void *p;这里出了问题,*(char **)q);/现在就可以正确排序了、代码修改如下}int comp(const void *p、}哪位高手能告诉我为什么;&#47,const void *q){
return -strcmp((char *)p、;&#47,const void *q){
return -strcmp(*(char **)p
提问者采纳
维数组并不是数组的数组,*(char (*)[20])q);*
参数为指向数组的指针。*/
&#47:int comp(const void *p。
你是要从大到小排列吗?不是的话就把负号去掉,const void *q){
return -strcmp(*(char (*)[20])p,而不是指向指针的指针。你的comp函数应该这么写
return -strcmp((char *)p,(char *)q);//现在就可以正确排序了、、、为什么这样也可以呢?
因为指向数组的指针指向的是数组的首地址,也就是字符串的首地址,所以这样也可以。
也就是说、p和q就是字符串的指针?
字符串的指针就是指向字符串首地址的指针,在这种情况下等价于指向数组的指针。你可以这么想:name是含有5个元素的数组,每个元素都是一个数组,qsort传递给比较函数的是指向元素的指针,也就是指向数组的指针,所以当name定义为二维数组或者是指针的数组的情况是不同的。也就是说如果name的定义是char *name[5];的话,比较函数的参数类型就是char**了。
“qsort传递给比较函数的是指向元素的指针”这句话、说到了点上、我就困惑它传的是什么。。。。那么、指向一个字符数组的指针、就是这个字符数组的首字母的地址了?
是的,这两个是同一个地址。
能不能解释下&当name定义为二维数组或者是指针的数组的情况是不同的&这句话?有什么不同?我还有一个例子、int main(){
char *str[4] ={&zha&, &zhonn&, &zhono&, &wu&};
qsort(str,4,sizeof(str[0]),comp);
//输出结果。。。}int comp(const void *p,const void *q){
-strcmp(*(char **)p,*(char **)q);//这个就可以进行排序、}
二维数组的元素是数组(char[]),而上述例子的元素为指针(char*),comp函数收到的参数为指向元素的指针,类型分别为char(*)[]和char**,而指向数组的指针指向的地址和其第一个元素的地址相同,所以情况一也可以用char*来代替指向数组的指针,而情况二中由于数组的元素为char*,comp的参数类型就是char**。
原来如此~能不能加你QQ啊?为了保护你的隐私、我说我的QQ吧、我的QQ:如果方便的话、交个朋友~晚安啦~
其他类似问题
为您推荐:
其他1条回答
再取值干什么;c&#39,而不是整个&quot。比如p;和'的ASCII码值当成两个地址去运算,那么不管你把p;abc&quot,*(char **)p和*(char **)q得到的值都是字符&#39,q指向的字符串分别是&;,&quot。然后comp函数再把'的ASCII码值;def&;字符串;def&a&#39,q强制转换成几级指针;a&#39,q就已经是字符串的指针了;d'abc&quot,&quot,你还要强制转换成char **p,当然出错了;和&#39
那么对int型排序为什么要先强制转换,再取值呢?return (*(int *)p - *(int *)q);
因为C语言规定,字符串的首地址就代表整个字符串,比如char *p=&abc&;那么printf(&%s&,p)就可以输出&abc& ,而不是printf(&%s&,*p);而其他类型没有字符串的这个特性,必须用(*指针)这样的方式才能获得指针指向的值。
原来如此、对int型排序就是要先强制转换指针类型为(int *)、然后再用(*)取值、进行比较~~~对吧~
是的。之所以字符串有特性,是因为国际标准规定,ASCII码值为0的字符为字符串结束符,字符串的末尾必定有字符串结束符,当然这个结束符是不可显示的。字符串结束符只被允许用于当做字符串末尾的标志,没有任何其他用途,所以,即使只给你一个字符串的首地址指针,我们只要在遍历字符串时看到数值为0的字符,就知道到字符串末尾了。而其他类型的数据中,任何数据都可能是有意义的,所以无法规定某个值去做该类型数组的结束符,因此就无法具备数组首地址即代表整个数组这个特性了。当然,通过数组首地址还是能遍历整个数组的,只不过数组本身并没有保存数组大小的信息,所以你不知道数组的末尾在哪里。
谢谢、解释的很清晰、你和楼上的那位都很热心、十分感激你们、你十四级、他四级、我就采纳他的了哈~能不能加你QQ啊?为了保护你的隐私、我说我的QQ吧、我的QQ:如果方便的话、交个朋友、我想往C/C++、VC方面发展~晚安啦~
字符串数组的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁c语言中的asc码_百度知道
c语言中的asc码
else if('&lt,n=0; gets(a).;)
n++;i++) {
if(a[i]=' char a[N].:&quot.;i&;a[i]& printf(&&}输入一串英文计算字母个数.;a[i]&0' for(i=0,n);请输入;
} } printf(&97'122''');||&#39#include&\90'#define N 50main(){ int i;)
break.;%d&N.又哪里错了;65&#39.h&gt
提问者采纳
com/zhidao/wh%3D450%2C600/sign=eb5de5ac62d0f703e6e79dd83dca7d0b/7a899e510fb30fc895d143ad4b031d:&quot.hiphotos,n=0;#define N 50main(){ int i;}运行结果是用vc++调试出来的; printf(&quot://b.=a[i]&i&lt.jpg" esrc="http:不能用连等于;N!,字符型数据可以和整型数据直接比较(自动类型转换)
n++;).=122)//错误二.
else if(65&请输入,错误原因已经列出; gets(a);,不要漏下等于的情况也有://b!<img class="ikqb_img" src="i++) {
if(a[i]==&#39;%d&quot.h&&/zhidao/wh%3D600%2C800/sign=c11dfde84b/7a899e510fb30fc895d143ad4b031d. char a[N].com/zhidao/pic/item/7a899e510fb30fc895d143ad4b031d;&amp更正
其他类似问题
为您推荐:
asc的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁c语言中在键盘上输入了一字符或对应的ASC||码,在C语言中如何区别出来_百度知道
比 70 稍小的数;;;5&#39,那么 65 是 比 60 稍大,如果不加任何解释;6&#39,这两个字符和字符A都没有共同之处如果强行把输入解释成数值,65是两个字符,第二个字符是 &#39,遇到空格跳出”,第一个字符是 &#39,而 A 会解释失败——这两个行为仍然是完全不同的-------------------------至于“输入六个数字这就好像在问如何把画着苹果的图片和写着“苹果”两个字的图片区分开你觉得你会混淆这两个图片吗真要说的话
用回车分割
那就可以做——不过跟解释成数字还是当成字符原样读入毫无关系要求 scanf 读入数字的话,scanf 就不会莫名其妙地把不相干的东西赋给 x[a] ,如果在输入数字之后输入了空格,空格仍然会留在缓冲区。因此可以把下一个字符和空格比较——例如scanf(&%d&...; scanf(&%c&,&ch); if (ch == &#39; &#39;)
如果分成两次输入,第二没有输入的话程序将停第二输入的位置无法循环下去啊
其他2条回答
键盘输入的原始数据全部是字符型;你说的整型,应该是说scanf吧,这个会自动把输入的字符串转换为对象的类型
后者是16进制码,组合起来会识别为字符
如何实现????c语言中在键盘上输入了一字符或对应的ASC||码,在C语言中如何区别出来_百度知道
比 70 稍小的数;;;5&#39,那么 65 是 比 60 稍大,如果不加任何解释;6&#39,这两个字符和字符A都没有共同之处如果强行把输入解释成数值,65是两个字符,第二个字符是 &#39,遇到空格跳出”,第一个字符是 &#39,而 A 会解释失败——这两个行为仍然是完全不同的-------------------------至于“输入六个数字这就好像在问如何把画着苹果的图片和写着“苹果”两个字的图片区分开你觉得你会混淆这两个图片吗真要说的话
用回车分割
那就可以做——不过跟解释成数字还是当成字符原样读入毫无关系要求 scanf 读入数字的话,scanf 就不会莫名其妙地把不相干的东西赋给 x[a] ,如果在输入数字之后输入了空格,空格仍然会留在缓冲区。因此可以把下一个字符和空格比较——例如scanf(&%d&...; scanf(&%c&,&ch); if (ch == &#39; &#39;)
如果分成两次输入,第二没有输入的话程序将停第二输入的位置无法循环下去啊
其他类似问题
为您推荐:
其他2条回答
键盘输入的原始数据全部是字符型;你说的整型,应该是说scanf吧,这个会自动把输入的字符串转换为对象的类型
后者是16进制码,组合起来会识别为字符
如何实现????
asc的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 c语言键盘输入字符串 的文章

 

随机推荐