一道C语言题目,跪求!!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道C语言题目,跪求!!相关的知识,希望对你有一定的参考价值。
#include <stdio.h>
#include<string.h>
main()
int i;
char s[10],t[10];
gets(t);
for(i=0;i<2;i++)
gets(s);
if (strcmp(t,s)<0)
strcpy(t,s);
printf("%s\n",t);
程序运行后,从键盘上输入(<CR>代表回车符):CDEF<CR>BADEF<CR>QTHRG<CR>,则程序输出结果为什么??
求高手讲解,答案是QTHRG
比较字符串是基于【字符串的字典序】的。给定两个字符串,谁的【字典序】大呢?这就可以通过 strcmp 函数来确定!
strcmp 的内部实现大致是这样的:
int strcmp (const char *str1, const char *str2 )
int i;
for(i=0;i<str1[i] != '\0' && str2[i] != '\0';i++)
// str1 和 str2 对应位置的字符相等,
//比较下一个字符
if(str1[i]==str2[i]) continue;
// str1 和 str2 对应位置的字符中,str1 [i] 的 ascii 码大于 str2 [i] 的 ascii 码,
//认为 str1 > str2,返回 1
else if(str1[i]>str2[i]) return 1;
// str1 和 str2 对应位置的字符中,str1 [i] 的 ascii 码小于 str2 [i] 的 ascii 码,
//认为 str1 < str2,返回 -1
else if(str1[i]<str2[i]) return -1;
// 如果执行到这里,说明 str1 和 str2 中至少有一个字符串中的字符已经在比较中用完了,
//即 str1[i] == '\0' 和 str2[i] == '\0' 至少有一个成立
//如果 str1 和 str2 中的字符在比较中同时用完了,并且没有发现对应位置有不同的字符,
//认为 str1 和 str2 相等,返回 0
if(str1[i] == '\0' && str2[i] == '\0') return 0;
//如果 str1 中的字符在比较中同时用完了,并且和 str2 对应位置上没有发现不同字符
//但是 str2 还有多余的字符(比如 str1="abc",str2="abcde",str2比str1多出"de")
//认为 str1 < str2 ,返回 -1
else if(str1[i] == '\0') return -1;
//如果 str2 中的字符在比较中同时用完了,并且和 str1 对应位置上没有发现不同字符
//但是 str1 还有多余的字符(比如 str1="abcde",str2="abc",str1比str2多出"de")
//认为 str1 > str2 ,返回 1
else if(str2[i]== '\0') return 1;
如果理解了 strcmp 函数的含义,那你的程序就容易理解了:
#include <stdio.h>
#include<string.h>
main()
int i;
char s[10],t[10];
// 首先读如一个字符串,保存在 t
gets(t);
for(i=0;i<2;i++)
//继续读入字符串,暂时保存在 s
gets(s);
//比较刚读入的字符串 s 和保存在 t 中的字符串 ,
//如果 t 中的字符串比 s 中的字符串【字典序】【小】
//(你应该已经理解一个字符串比另一个字符串【字典序】【小】的含义了吧?)
//则把 s 字符串中的内容拷贝到 t 字符串中(没错,strcpy 函数就是做这个事情的)
if (strcmp(t,s)<0)
//通过这次拷贝,t 中保存的字符串又成功的变回你【当前已经输入】的字符串中
//【字典序】【最大】的了!!!
strcpy(t,s);
//到这里你应该知道,t 中保存的字符串是你输入的【所有字符串】中【字典序最大】的!!
printf("%s\n",t);
参考技术A gets(t);//第一个输入的字符串CDEF保存在t内
for(i=0;i<2;i++)
gets(s);
if (strcmp(t,s)<0)
strcpy(t,s);
//后面输入的两个字符串保存在s内,比较t,s两个字符串,如果t<s,则strcmp函数返回<0的值,则if条件成立,这时将s赋值给t。
因为CDEF第一个字符为c,BADEF第一个字符为B,在字符串比较中,C>B,所以t>s,所以不执行if中的语句。
而第二次循环中,c<Q,所以QTHRG赋值给t.
最终输出t的值为QTHRG 参考技术B main()
int i;
char s[10],t[10];
gets(t); //输入字符串t
for(i=0;i<2;i++)
gets(s); //输入字符串s,
if (strcmp(t,s)<0) //比较t和s,
strcpy(t,s); //t<s的话,把s拷贝到t中,
printf("%s\n",t);
因为BADEF<CDEF,所以第一次不拷贝
CDEF<QTHRG,这时候会拷贝
所以结果是QTHRG 参考技术C 在第一次循环时,strcmp()函数判断出t不小于s,于是条件为假,不执行。
第二次循环时,t恰小于s,条件为真,于是发生复制,输出为首字母ASCII码较大的字符串,即QTHRG 参考技术D #include <stdio.h>
#include<string.h>
main()
int i;
char s[10],t[10];
gets(t); //t[]=CDEF
for(i=0;i<2;i++)
gets(s); //第一次循环,s[]=BADEF 然后字符串比较,t>s, 不符合if 要求
if (strcmp(t,s)<0) //无操作;第二次循环s[]=QTHRG, 然后字符串比较,t<s,不符合if 要求
strcpy(t,s); //复制t[]=s[]=QTHRG
printf("%s\n",t); //打印,即答案t[]=s[]=QTHRG
第5个回答 2011-02-22 #include <stdio.h>
#include<string.h>
void main()
char s[10];
char t[10];
gets(t);
gets(s);
if (strcmp(t,s)<0)//当t<s时,返回值<0 两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
strcpy(t,s);//把s的ASCII值拷贝到t
printf("%s\n",t);//输出的就是ASCII值较大者
不明白为何要使用循环来判断呢?
以上是关于一道C语言题目,跪求!!的主要内容,如果未能解决你的问题,请参考以下文章