从键盘读入字符串两个字符串分别保存在一维字符数中,比较两个字符串大小(不用strcmp函数)

写一个strcmp函数
用一个函数实现两个字符串的比较,即自己写一个strcmp函数,函数的原型为:
int& strcmp(char&
*p1,char& *p2);
设p1指向字符串s1,p2指向字符串s2.要求当两个字符相同时返回0,若两个字符串不相等,则返回返回它们二者第一个不同字符的ASCII码的差值。两个字符串s1,s2由主函数输入,strcmp函数的返回值也由主函数输出。
#include "stdafx.h"
#include &stdio.h&
void main()
& int strcmp(char *p1,char *p2);
& char str1[50],char str2[50];
& printf("Input str1\n");
& gets(str1);
& printf("Input str2\n");
& gets(str2);
& printf("Result:%d \n",strcmp(str1,str2));
int strcmp(char *p1,char *p2)
&while(*(p1+i)==*(p2+i))
&&if(*(p1+i++)=='\0')
&return *(p1+i)-*(p2+i);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。定义2个字符串,把第二个字符串的内容拷贝到第一个字符串的末尾_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
定义2个字符串,把第二个字符串的内容拷贝到第一个字符串的末尾
我有更好的答案
cin.getline(ch2,20;请输入第二串字符:&,20,'&&lt,slen++)
s[slen] = t[i];&lt,'&#92!=' cin.getline(& for(int i=0;t[i]; s[slen] = '请输入第一串字符:&;}int main(){ char ch[1000],ch2[20]; int flag=0; cout&lt,ch2); cout&&\0'#include&iostream&#include&string&void strcmp(char *s,char *t){
int slen = strlen(s);&
strcmp(i++;ch&);\n'); cout&n'\0'
采纳率:38%
c);} 注意在本例的printf函数中,使用的格式字符串为“%s”,表示输出的是一个字符串。而在输出表列中给出数组名则可;n&;i++)
for(j=0;j&是由C编译系统自动加上的。由于采用了‘&#92,st);%s&quot,st1;0&#39,也可以定义为int c[10]但这时每个数组元素占2个字节的内存单元。字符数组也可以是二维或多维数组。例如,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。7.3.6
字符串处理函数C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数,在使用前应包含头文件&stdio.h&,使用其它字符串函数则应包含头文件&string.h&。下面介绍几个最常用的字符串函数。1. 字符串输出函数 puts格式:
puts (字符数组名)功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。#include&stdio.h&main(){
char c[]=&BASIC\ndBASE&;
puts(c);}从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。2. 字符串输入函数gets
(字符数组名)
功能:从标准输入设备键盘上输入一个字符串。 本函数得到一个函数值,即为该字符数组的首地址。#include&stdio.h&main(){
char st[15];
printf(&input string:\n&);
puts(st);}
可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。3. 字符串连接函数strcat
strcat (字符数组名1,字符数组名2)
功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。#include&string.h&main(){
static char st1[30]=&My name is &;
int st2[10];
printf(&input your name:\n&);
gets(st2);
strcat(st1,st2);
puts(st1);}
本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。4. 字符串拷贝函数strcpy格式:
strcpy (字符数组名1,字符数组名2)功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。#include&string.h&main(){
char st1[15],st2[]=&C Language&;
strcpy(st1,st2);
puts(st1);printf(&\n&);}本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。5. 字符串比较函数strcmp格式:
strcmp(字符数组名1,字符数组名2)功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
字符串1=字符串2,返回值=0;
字符串2〉字符串2,返回值〉0;
字符串1〈字符串2,返回值〈0。本函数也可用于比较两个字符串常量,或比较数组和字符串常量。#include&string.h&main(){
static char st1[15],st2[]=&C Language&;
printf(&input a string:\n&);
gets(st1);
k=strcmp(st1,st2);
if(k==0) printf(&st1=st2\n&);
if(k&0) printf(&st1&st2\n&);
if(k&0) printf(&st1&st2\n&);}本程序中把输入的字符串和数组st2中的串比较,比较结果返回到k中,根据k值再输出结果提示串。当输入为dbase时,由ASCII 码可知“dBASE”大于“C Language”故k〉0,输出结果“st1&st2”。6. 测字符串长度函数strlen格式:
strlen(字符数组名)功能:测字符串的实际长度(不含字符串结束标志‘\0’) 并作为函数返回值。#include&string.h&main(){
static char st[]=&C language&;
k=strlen(st);
printf(&The lenth of the string is %d\n&,k);}7.4
程序举例输入五个国家的名称按字母顺序排列输出。
本题编程思路如下:五个国家名应由一个二维字符数组来处理。然而C语言规定可以把一个二维数组当成多个一维数组处理。因此本题又可以按五个一维数组处理, 而每一个一维数组就是一个国家名字符串。用字符串比较函数比较各一维数组的大小,并排序,输出结果即可。编程如下:main(){
char st[20],cs[5][20];
int i,j,p;
printf(&input country's name:\n&);
for(i=0;i&5;i++)
gets(cs[i]);
printf(&\n&);
for(i=0;i&5;i++)
{ p=i;strcpy(st,cs[i]); for(j=i+1;j&5;j++)
if(strcmp(cs[j],st)&0)
{ strcpy(st,cs[i]); strcpy(cs[i],cs[p]); strcpy(cs[p],st);
puts(cs[i]);}printf(&\n&);}本程序的第一个for语句中,用gets函数输入五个国家名字符串。上面说过C语言允许把一个二维数组按多个一维数组处理,本程序说明cs[5][20]为二维字符数组,可分为五个一维数组cs[0],cs[1],cs[2],cs[3],cs[4]。因此在gets函数中使用cs[i]是合法的。在第二个for语句中又嵌套了一个for语句组成双重循环。这个双重循环完成按字母顺序排序的工作。在外层循环中把字符数组cs[i]中的国名字符串拷贝到数组st中,并把下标i赋予P。进入内层循环后,把st与cs[i]以后的各字符串作比较,若有比st小者则把该字符串拷贝到st中,并把其下标赋予p。内循环完成后如p不等于i说明有比cs[i]更小的字符串出现,因此交换cs[i]和st的内容。至此已确定了数组cs的第i号元素的排序值。然后输出该字符串。在外循环全部完成之后即完成全部排序和输出。7.5
本章小结1.数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组以及后面将要介绍的指针数组,结构数组等。2.数组可以是一维的,二维的或多维的。3.数组类型说明由类型说明符、数组名、数组长度(数组元素个数)三部分组成。数组元素又称为下标变量。数组的类型是指下标变量取值的类型。4.对数组的赋值可以用数组初始化赋值,输入函数动态赋值和赋值语句赋值三种方法实现。对数值数组不能用赋值语句整体赋值、输入或输出,而必须用循环语句逐个对数组元素进行操作。另外,虚机团上产品团购,超级便宜;}本例中由于定义数组长度为15.4
字符串和字符串结束标志在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时;
printf(&&#92, 输入的一行字符的空格分段分别装入四个数组;
printf(&%s&#92,st3;,&c);则是错误的。在执行函数printf(&%s&.5
字符数组的输入输出在采用字符串方式后,字符数组的输入输出将变得简单方便,st2;0&#39,st4);
printf(&%s&quot.3;标志,所以在用字符串赋初值时一般无须指定数组的长度;n&);
scanf(&%s%s%s%s&,这是为什么呢?这是由于在C语言中规定,数组名就代表了该数组的首地址;
printf(&%s\。上面的数组c在内存中的实际存放情况为,并以此作为该字符串是否结束的标志。有了'赋值后各元素的值为;main(){
char st[15];
printf(&quot,可多设几个字符数组分段存放含空格的串。程序可改写如下:main(){
char st1[6]。除了上述用字符串赋初值的办法外。则数组名c就代表这个首地址;,a[i][j])。7。C[0] C[1] C[2] C[3] C[4] C[5] C[6] C[7] C[8] C[9] 设数组c的首地址为2000,c) 时,按数组名c找到首地址:
char c[5][10],st)。C语言允许用字符串的方式对数组作初始化赋值。因此在c前面不能再加地址运算符&。如写作scanf(&用字符串方式赋值比用字符逐个赋值要多占一个字节;input string:&#92:
input string:
this is a book输出为:this从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况:
c[0]的值为‘c’c[1]的值为‘ ’c[2]的值为‘p’ c[3]的值为‘r’c[4]的值为‘0’c[5]的值为‘g’c[6]的值为‘r’c[7]的值为‘a’c[8]的值为‘m’其中c[9]未赋值;=4;j++)
printf(&input string:&#92。应该说明的是,对一个字符数组,如果不作初始化赋值,则必须说明数组长度。还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格:
char c[10];由于字符型和整型通用,也把结束符'
for(i=0,因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志`\0`:
char c[10]=,已说明字符串总是以&#39:C
p r o g r a m \0‘\n&);
}}本例的二维字符数组由于在初始化时全部元素都赋以初值,因此一维下标的长度可以不加以说明。如有字符数组char c[10],在内存可表示如图;,c[]),否则将以空格作为串的结束符,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串;n&,由的值为‘p’系统自动赋予0值,st2[6],st3[6],},也就是说c[0]单元地址为2000, 而由系统自行处理。然后分别输出这四个数组中的字符串。在前面介绍过。当对全体元素赋初值时也可以省去长度说明,st1;n&, 用于存放字符串结束标志'\C program&;\0'存入数组。例如当输入的字符串中含有空格时。7,而不必使用循环语句逐个地输入输出每个字符。main(){
char c[]=&BASIC\ndBASE&;0&#39。例如:
char c[]=;这时C数组的长度自动定为9。7.3.3
字符数组的引用main(){
char a[][5]=。整个数组是以首地址开头的一块连续的内存单元;i&=1;\0'标志后,就不必再用字符数组的长度来判断字符串的长度了,scanf的各输入项必须以地址方式出现;%c&quot,st4[6];
printf(&quot,st2;\0'作为串的结束符。因此当把一个字符串存入一个数组时,如 &a,&b等。但在前例中却是以数组名方式出现的。例如:
char c[]=;可写为:
char c[]=;
或去掉{}写为:
char c[]=&quot.3;%s %s %s %s\即为二维字符数组。7.3.2
字符数组的初始化字符数组也允许在定义时作初始化赋值。例如;n&);
scanf(&%s&,运行情况为,st3,st4);}
本程序分别设了四个数组7.3字符数组用来存放字符量的数组称为字符数组。7.3.1
字符数组的定义字符数组形式与前面介绍的数值数组相同。例如。不能写为:printf(&quot
int *mystrcpy(char *str, char *ct){ char *p = while(*str)
str++; while((*str++ = *ct, *ct++)); }
7.3字符数组用来存放字符量的数组称为字符数组。7.3.1
字符数组的定义字符数组形式与前面介绍的数值数组相同。例如:
char c[10];由于字符型和整型通用,也可以定义为int c[10]但这时每个数组元素占2个字节的内存单元。字符数组也可以是二维或多维数组。例如:
char c[5][10];即为二维字符数组。7.3.2
字符数组的初始化字符数组也允许在定义时作初始化赋值。例如:
char c[10]=;赋值后各元素的值为:
c[0]的值为‘c’c[1]的值为‘ ’c[2]的值为‘p’ c[3]的值为‘r’c[4]的值为‘0’c[5]的值为‘g’c[6]的值为‘r’c[7]的值为‘a’c[8]的值为‘m’其中c[9]未赋值,由的值为‘p’系统自动赋予0值。当对全体元素赋初值时也可以省去长度说明。例如:
char c[]=;这时C数组的长度自动定为9。7.3.3
字符数组的引用main(){
char a[][5]=,};
for(i=0;i&=1;i++)
for(j=0;j&=4;j++)
printf(&%c&,a[i][j]);
printf(&\n&);
}}本例的二维字符数组由于在初始化时全部元素都赋以初值,因此一维下标的长度可以不加以说明。7.3.4
字符串和字符串结束标志在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。C语言允许用字符串的方式对数组作初始化赋值。例如:
char c[]=;可写为:
char c[]=;
或去掉{}写为:
char c[]=&C program&;用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。上面的数组c在内存中的实际存放情况为:C
p r o g r a m \0‘\0'是由C编译系统自动加上的。由于采用了‘\0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。7.3.5
字符数组的输入输出在采用字符串方式后,字符数组的输入输出将变得简单方便。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。main(){
char c[]=&BASIC\ndBASE&;
printf(&%s\n&,c);} 注意在本例的printf函数中,使用的格式字符串为“%s”,表示输出的是一个字符串。而在输出表列中给出数组名则可。不能写为:printf(&%s&,c[]);main(){
char st[15];
printf(&input string:\n&);
scanf(&%s&,st);
printf(&%s\n&,st);}本例中由于定义数组长度为15,因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志`\0`。应该说明的是,对一个字符数组,如果不作初始化赋值,则必须说明数组长度。还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。例如当输入的字符串中含有空格时,运行情况为:
input string:
this is a book输出为:this从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可多设几个字符数组分段存放含空格的串。程序可改写如下:main(){
char st1[6],st2[6],st3[6],st4[6];
printf(&input string:\n&);
scanf(&%s%s%s%s&,st1,st2,st3,st4);
printf(&%s %s %s %s\n&,st1,st2,st3,st4);}
本程序分别设了四个数组, 输入的一行字符的空格分段分别装入四个数组。然后分别输出这四个数组中的字符串。在前面介绍过,scanf的各输入项必须以地址方式出现,如 &a,&b等。但在前例中却是以数组名方式出现的,这是为什么呢?这是由于在C语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块连续的内存单元。如有字符数组char c[10],在内存可表示如图。C[0] C[1] C[2] C[3] C[4] C[5] C[6] C[7] C[8] C[9] 设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。如写作scanf(&%s&,&c);则是错误的。在执行函数printf(&%s&,c) 时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。7.3.6
字符串处理函数C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数,在使用前应包含头文件&stdio.h&,使用其它字符串函数则应包含头文件&string.h&。下面介绍几个最常用的字符串函数。1. 字符串输出函数 puts格式:
puts (字符数组名)功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。#include&stdio.h&main(){
char c[]=&BASIC\ndBASE&;
puts(c);}从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。2. 字符串输入函数gets
(字符数组名)
功能:从标准输入设备键盘上输入一个字符串。 本函数得到一个函数值,即为该字符数组的首地址。#include&stdio.h&main(){
char st[15];
printf(&input string:\n&);
puts(st);}
可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。3. 字符串连接函数strcat
strcat (字符数组名1,字符数组名2)
功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。#include&string.h&main(){
static char st1[30]=&My name is &;
int st2[10];
printf(&input your name:\n&);
gets(st2);
strcat(st1,st2);
puts(st1);}
本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。4. 字符串拷贝函数strcpy格式:
strcpy (字符数组名1,字符数组名2)功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。#include&string.h&main(){
char st1[15],st2[]=&C Language&;
strcpy(st1,st2);
puts(st1);printf(&\n&);}本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。5. 字符串比较函数strcmp格式:
strcmp(字符数组名1,字符数组名2)功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
字符串1=字符串2,返回值=0;
字符串2〉字符串2,返回值〉0;
字符串1〈字符串2,返回值〈0。本函数也可用于比较两个字符串常量,或比较数组和字符串常量。#include&string.h&main(){
static char st1[15],st2[]=&C Language&;
printf(&input a string:\n&);
gets(st1);
k=strcmp(st1,st2);
if(k==0) printf(&st1=st2\n&);
if(k&0) printf(&st1&st2\n&);
if(k&0) printf(&st1&st2\n&);}本程序中把输入的字符串和数组st2中的串比较,比较结果返回到k中,根据k值再输出结果提示串。当输入为dbase时,由ASCII 码可知“dBASE”大于“C Language”故k〉0,输出结果“st1&st2”。6. 测字符串长度函数strlen格式:
strlen(字符数组名)功能:测字符串的实际长度(不含字符串结束标志‘\0’) 并作为函数返回值。#include&string.h&main(){
static char st[]=&C language&;
k=strlen(st);
printf(&The lenth of the string is %d\n&,k);}7.4
程序举例输入五个国家的名称按字母顺序排列输出。
本题编程思路如下:五个国家名应由一个二维字符数组来处理。然而C语言规定可以把一个二维数组当成多个一维数组处理。因此本题又可以按五个一维数组处理, 而每一个一维数组就是一个国家名字符串。用字符串比较函数比较各一维数组的大小,并排序,输出结果即可。编程如下:main(){
char st[20],cs[5][20];
int i,j,p;
printf(&input country's name:\n&);
for(i=0;i&5;i++)
gets(cs[i]);
printf(&\n&);
for(i=0;i&5;i++)
{ p=i;strcpy(st,cs[i]); for(j=i+1;j&5;j++)
if(strcmp(cs[j],st)&0)
{ strcpy(st,cs[i]); strcpy(cs[i],cs[p]); strcpy(cs[p],st);
puts(cs[i]);}printf(&\n&);}本程序的第一个for语句中,用gets函数输入五个国家名字符串。上面说过C语言允许把一个二维数组按多个一维数组处理,本程序说明cs[5][20]为二维字符数组,可分为五个一维数组cs[0],cs[1],cs[2],cs[3],cs[4]。因此在gets函数中使用cs[i]是合法的。在第二个for语句中又嵌套了一个for语句组成双重循环。这个双重循环完成按字母顺序排序的工作。在外层循环中把字符数组cs[i]中的国名字符串拷贝到数组st中,并把下标i赋予P。进入内层循环后,把st与cs[i]以后的各字符串作比较,若有比st小者则把该字符串拷贝到st中,并把其下标赋予p。内循环完成后如p不等于i说明有比cs[i]更小的字符串出现,因此交换cs[i]和st的内容。至此已确定了数组cs的第i号元素的排序值。然后输出该字符串。在外循环全部完成之后即完成全部排序和输出。7.5
本章小结1.数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组以及后面将要介绍的指针数组,结构数组等。2.数组可以是一维的,二维的或多维的。3.数组类型说明由类型说明符、数组名、数组长度(数组元素个数)三部分组成。数组元素又称为下标变量。数组的类型是指下标变量取值的类型。4.对数组的赋值可以用数组初始化赋值,输入函数动态赋值和赋值语句赋值三种方法实现。对数值数组不能用赋值语句整体赋值、输入或输出,而必须用循环语句逐个对数组元素进行操作。
strcat(char *dst,char *src)
其他2条回答
为您推荐:
其他类似问题
字符串的相关知识
换一换
回答问题,赢新手礼包当前位置: >>
实验6 数组――参考答案
实验 6 数组一、一维数组实验2. 编程:输入长度为 10 的整型数组并输出;然后将其逆序存放后再输出。例如: 编程: Input 10 number: 0 1 2 3 4 5 6 7 8 9 After reversed: 9 8 7 6 5 4 3 2 1 0 #include&stdio.h& void main() { int i, j, a[10], printf(&Input 10 number: &); for(i=0; i&10; i++) scanf(&%d&, &a[i]); printf(&origin data: &); for(i=0; i&10; i++) printf(&%d &, a[i]); printf(&\n&); for(i=0,j=9; i& i++,j--) { t=a[i]; a[i]=a[j]; a[j]= } printf(&After reversed: &); for(i=0; i&10; i++) printf(&%d &, a[i]); printf(&\n&); } /*逆序存放 逆序存放*/ 逆序存放 /*输出原始数据 输出原始数据*/ 输出原始数据 /*读入数据 读入数据*/ 读入数据/*输出逆序存放后的数据 输出逆序存放后的数据*/ 输出逆序存放后的数据3. 编程:输入 n 个(1&n&=10)正整数并保存到数组中,求出最大值、最小值、平均值,以及最大值、最小 编程: 值在数组中的下标分别是多少。例如: Input n: 5 Input 5 integer: 8 2 5 1 4 max=8 index=0 min=1 index=3 average=4 #include &stdio.h& void main() { int i, n , max, min, a[10], printf(&Input n (1&n&=10): &); scanf(&%d&, &n); if(1&n && n&=10) { printf(&Input %d integer:&, n); for(i=0, sum=0; i&n; i++) { scanf(&%d&, &a[i]); sum+=a[i]; } average=(float)sum/n; for(i=0, max=0, min=0; i&n; i++) { if(a[i] & a[max]) max= if(a[i] & a[min]) min= } /*输入数据并求累加和*/ 输入数据并求累加和 输入数据并求累加和/*求出平均值 求出平均值*/ 求出平均值 /*求最大、最小值的下标*/ 求最大、最小值的下标 求最大printf(&max=%-5d index=%d\n&, a[max], max); printf(&min=%-5d index=%d\n&, a[min], min); printf(&average=%.2f\n&, average); } else printf(&数据超出范围 数据超出范围&); 数据超出范围 } 4. 编程:青年歌手参加歌曲大奖赛,有 10 个评委对她(他)进行打分,试编程求这位选手的平均得分并输 编程: 出(去掉一个最高分和一个最低分) 。 #include &stdio.h& void main() { int i, max, float a[10], printf(&请输入 10 个评委的打分:&); 请输入 个评委的打分: for(i=0, ave=0; i&10; i++) { scanf(&%f&, &a[i]);/*输入分数并求累加和 输入分数并求累加和*/ 输入分数并求累加和 ave+=a[i]; } for(i=0, max=0 , min=0; i&10; i++) { if(a[i]&a[max]) max=i; if(a[i]&a[min]) min=i; } ave=ave-a[max]-a[min]; ave=ave/8; printf(&该选手的评委打分是:&); 该选手的评委打分是: 该选手的评委打分是 for(i=0; i&10; i++) printf(&%.2f &, a[i]); printf(&\n&); printf(&去掉最高分 去掉最高分%.2f,去掉最低分 去掉最高分 ,去掉最低分%.2f,该选手的平均得分是 ,该选手的平均得分是%.2f\n&, a[max], a[min], ave); } /*求最大、最小值的下标*/ 求最大、最小值的下标 求最大5. 编程:用两种方法输出斐波那切数列的前 40 项(参考例 6-4) 编程: 。 要求: (1)方法 1:不使用数组; #include &stdio.h& void main() { int f1=1, f2=1, f3, printf(&%12d%12d&, f1, f2); for(i=3; i&=40; i++) { f3=f1+f2; printf(&%12d&, f3); if(i%5==0) printf(&\n&); f1= f2; f2= f3; } }(2)方法 2:使用一维数组。 #include &stdio.h& void main() { int fib[40]; fib[0]=fib[1]=1; for(i=2; i&40; i++) fib[i]= fib[i-1] + fib[i-2]; for(i=0; i&40; i++) { printf(&%12d&,fib[i]); if((i+1)%5==0) printf(&\n&); } } /*计算其余的 38 个数 计算其余的 个数*/6. 编程:输入 n 个(1&n&=10)float 型的数据并保存到数组中,用冒泡法或选择法将它们从大到小排序后 编程: 输出。例如: Input n: 5 Input 5 number: 8.5 2.3 5.1 1.4 4.9 After sorted: 8.50 5.10 4.90 2.30 1.40 #include &stdio.h& void main() { int i, j, float a[10], printf(&Input n: &); scanf(&%d&,&n); if(n&1 && n&=10) { printf(&Input %d number:&, n); for(i=0;i&n;i++) scanf(&%f&,&a[i]); printf(&Before sorted:&); for(i=0; i&n; i++) printf(&%.2f &, a[i]); printf(&\n&); for(i=0; i&n-1; i++) for(j=0; j&n-i-1; j++) if( a[j] & a[j+1] ) /*输出排序前的数据 输出排序前的数据*/ 输出排序前的数据/*冒泡排序 冒泡排序*/ 冒泡排序 { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } printf(&After sorted:&); for(i=0; i&n; i++) printf(&%.2f &, a[i]); printf(&\n&); } else printf(&数据超出范围 数据超出范围&); 数据超出范围 } /*输出排序结果 输出排序结果*/ 输出排序结果7. 在上题基础上 输入 n 个 float 型的数据并保存到数组中, 型的数据并保存到数组中, 用冒泡法或选择法将它们从大到小排序后输出) ( 用冒泡法或选择法将它们从大到小排序后输出) 完成:在已经排好序的数组(长度不足 10)中插入一个数 m(键盘输入)后输出,保持数组的降序排列。 完成 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数, 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数, 依次后移一个位置。 依次后移一个位置。 #include &stdio.h& void main() { int i, j, n, float a[10], t, printf(&Input n: &); scanf(&%d&, &n); if(n&1 && n&=10) { printf(&Input %d number:&, n); for(i=0; i&n; i++) scanf(&%f&, &a[i]); printf(&Before sorted: &); for(i=0; i&n; i++) printf(&%.2f &, a[i]); printf(&\n&); for(i=0; i&n-1; i++) for(j=0; j&n-i-1; j++) if( a[j] & a[j+1] ) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; /*输出排序前的数据*/ 输出排序前的数据 输出排序前的数据/*冒泡排序 冒泡排序*/ 冒泡排序 } printf(&After sorted:&); for(i=0; i&n; i++) printf(&%.2f &, a[i]); printf(&\n&); printf(&请输入要插入的数据 m: &); 请输入要插入的数据 scanf(&%f&, &m); /*找到插入位置 找到插入位置*/ 找到插入位置 if(m & a[n-1]) p = else { for(i=0; i&n; i++) if( m & a[i]) { p=i; } for(i=n; i&=p+1; i--) a[i]=a[i-1]; } /*插入 插入*/ 插入 a[p]=m; printf(&插入 插入%.2f 后:&, m); 插入 for(i=0; i&n+1; i++) printf(&%.2f &, a[i]); printf(&\n&); } else printf(&数据超出范围 数据超出范围&); 数据超出范围 } /*输出插入后结果 输出插入后结果*/ 输出插入后结果 /*输出排序结果 输出排序结果*/ 输出排序结果/*如果 m 比最后一个元素小,则直接插入到最后的位置 如果 比最后一个元素小, 直接插入到最后的位置*/ 插入到最后的位置/*否则,插入到中间的某个位置*/ 否则,插入到中间的某个位置 否则/*将插入位置之后的元素后移 将插入位置之后的元素后移*/ 将插入位置之后的元素后移二、二维数组实验 二维数组实验1. 以下程序功能为 以下程序功能为:将下列矩阵中的元素向右移动一列,最后一列移至第一列。找出并改正以下源程序中 错误,通过调试得出正确的运行结果。 1 4 6 8 10 12 源程序(有错误的程序) 源程序 #include &stdio.h& #define ROW 2 #define COL 3 int main() { int a[ROW][COL]={1,4,6,8,10,12}; int i,j, for(i=0;i&ROW;i++) { temp=a[i][COL-1]; for(j=COL-2;j&=0;j--) { a[i][j]=a[i][j+1]; } a[i][0]= } for(int i=0;i&ROW;i++) { for(j=0;j&COL;j++) printf(&%6d&,a[i][j]); printf(&\n&); } return 0; } 运行结果(改正后程序的运行结果) 6 1 4 12 8 10 2. 编程:利用二维数组计算并打印一个 n 行的杨辉三角。例如: 编程: Input n: 6 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 4 10 10 5 1 提示:第一列及对角线上的元素都是 1,其他元素通过计算得出: 如果用 i 表示行,j 表示列,则第 i 行 j 列的元素 pi , j = pi ?1, j ?1 + pi ?1, j #include &stdio.h& void main() { int a[10][10]={0}; int i, j, //设最多 10 层 设最多/*调试时设置断点*/ /*调试时设置断点*///改为 a[i][j+1]=a[i][j];//去掉 intprintf(&请输入杨辉三角形的层数:&); 请输入杨辉三角形的层数: 请输入杨辉三角形的层数 scanf(&%d&, &n); if(n&10) { printf(&层数超出范围 层数超出范围&); 层数超出范围 } for(i=0;i&n;i++) { a[i][0]=1; a[i][i]=1; } //给第 0 列和主对角线上的元素赋值 1 给第for(i=2;i&n;i++) //计算其他位置元素的值 计算其他位置元素的值 for(j=1;j&i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i&n;i++) //输出 输出 { for(j=0;j&=i;j++) printf(&%4d&,a[i][j]); printf(&\n&); } }3. 编程:通过键盘输入 3 行 4 列的二维数组,分别按行和按列输出数组。例如: 编程: Input numner: 1 2 3 4 5 6 7 8 9 10 11 0 output by row: 1 2 3 4 5 6 7 8 9 10 11 0 output by col: 1 5 9 2 6 10 3 7 11 4 8 0 #include &stdio.h& void main() { int a[3][4],i,j; printf(&请输入 3 X 4 整数矩阵 请输入 整数矩阵:\n&); for(i=0; i&3; i++) for(j=0; j&4; j++) scanf(&%d&, &a[i][j]); printf(&按行输出 按行输出:&); 按行输出 for(i=0; i&3; i++) for(j=0; j&4; j++) printf(&%d &,a[i][j]); printf(&\n&); printf(&按列输出 按列输出:&); 按列输出 for(i=0; i&4; i++) for(j=0; j&3; j++) printf(&%d &,a[j][i]); printf(&\n&); }4. 编程:输入一个 m*n 矩阵,求他们的各行元素之和。例如: 编程: Input m , n: 2 2 Input 2*2 matrix: 4 5 5 6 sum[0]=9 sum[1]=11 提示:设计一个一维数组 int s[10],分别保存各行元素之和。 #include &stdio.h& void main() { int a[10][10], s[10]={0}; int m, n, i, //设定矩阵最大为 10 x 10 设定矩阵最大为printf(&请输入矩阵的行数和列数 请输入矩阵的行数和列数:&); 请输入矩阵的行数和列数 scanf(&%d%d&, &m, &n); if(m&0 || m&10 || n&0 || n&10) { printf(&行或列 ~10)值超出范围 行或列(1~ 值超出范围&); 行或列 值超出范围 } printf(&请输入 %d*%d 矩阵 请输入 矩阵:\n&,m,n); for(i=0; i&m; i++) for(j=0; j&n; j++) scanf(&%d&,&a[i][j]); //求各行之和并输出 求各行之和并输出 for(i=0; i&m; i++) { for(j=0; j&n; j++) s[i]+=a[i][j]; printf(&sun[%d]= %d \n&, i, s[i]); } } 5. 编程:判断一个二维数组是否存在鞍点,若存在,则输出鞍点及其行号和列号;否则输出没有鞍点信息。 编程: “鞍点”是指这样的元素:它在本行是最大元素,而在本列是最小的元素。 Input m , n: 2 2 Input 2*2 matrix: 4 5 5 6 i=0, j=1, saddle point: 5 提示:找鞍点需要处理三件事情: (1)找每行中最大值所在的列下标; (2)判断该元素在本列上是否为最小; (3)判断是否找到了鞍点,若找到,输出。 #include &stdio.h& void main() { int a[10][10]; //设定矩阵最大为 10 x 10 设定矩阵最大为 int m, n, i, j, col, flag=0; printf(&请输入矩阵的行数和列数 请输入矩阵的行数和列数:&); 请输入矩阵的行数和列数 scanf(&%d%d&, &m, &n); if(m&0 || m&10 || n&0 || n&10) { printf(&行或列 ~10)值超出范围 行或列(1~ 值超出范围&); 行或列 值超出范围 } printf(&请输入 %d*%d 矩阵 请输入 矩阵:\n&,m,n); for(i=0; i&m; i++) for(j=0; j&n; j++) scanf(&%d&,&a[i][j]); for(i=0; i&m; i++) { col=0; for(j=1; j&n; j++) if(a[i][col]&a[i][j]) col=j; for(j=0; j&m; j++) if(a[i][col]&a[j][col]) if(j==m) { //找出第 i 行中的最大值所在列下标 col 找出第 //退出程序 退出程序//判断该元素在本列上是否为最小 判断该元素在本列上是否为最小flag=1; //有鞍点 有鞍点 printf(&i=%d, j=%d, saddle point:%d\n&,i,col,a[i][col]); } } if(flag==0) printf(&No saddle point!\n&); }三、字符串实验 字符串实验1. 以下程序功能为 以下程序功能为:输入一个字符串,将其逆序输出。找出并改正以下源程序中错误,通过调试得出正确 的运行结果。 源代码(有错误的程序) #include &stdio.h& #include &string.h& void main() { int i,j; char s[80],result[80]; printf(&Enter a string:\n&); gets(s); for(i=strlen(s)-1,j=0;i&=0;i--,j++) { result[j]=s[i]; } result[j]='\0'; //必须给字符串加上串结束标志 printf(&This is reverse string:\n&); puts(result); } 运行结果(改正后的程序) Enter a string : asdfg This is the reverse string: gfdsa 2. 编程:任意输一个字符串保存在一维字符数组中,求其长度(不用 strlen 函数) 编程: 。例如: Input a string: aadfdg length=6 提示: 提示:字符串的有效长度就是有效字符的个数,即数组中第一个‘\0’前面的字符个数。 #include &stdio.h& void main() { int i, len=0; char s[80]; printf(&请输入字符串,以回车键结束:&); 请输入字符串,以回车键结束 请输入字符串 gets(s); for(i=0; s[i]!='\0'; i++) len++; printf(&字符串 的长度为:%d\n&,s, len); 字符串%s 的长度为: 字符串 } 3. 编程:任意输入两个字符串分别保存在一维字符数组中,把第二个字符串连接到第一个字符串末尾(不 编程: 用 strcat 函数) 。例如: Input two string: asdfg erty after strcat: asdfgerty #include &stdio.h& void main() { int i,j; char s1[80], s2[80]; printf(&请输入字符串 1 以回车键结束 请输入字符串 以回车键结束:\n&); gets(s1); printf(&请输入字符串 2 以回车键结束 请输入字符串 以回车键结束:\n&); gets(s2); for(i=0; s1[i]!='\0'; i++) ; for(j=0; s2[j] && i&80; i++, j++ ) s1[i]=s2[j]; s1[i]='\0'; printf(&两个串连接后 两个串连接后:%s\n&,s1); 两个串连接后 } 4. 编程:从键盘读入两个字符串分别保存在一维字符数中,比较两个字符串大小(不用 strcmp 函数) 编程: ,输出 较大的字符串。 #include &stdio.h& void main() { char a[80], b[80]; printf(&请输入字符串 1 以回车键结束 请输入字符串 以回车键结束:\n&); gets(a); printf(&请输入字符串 2 以回车键结束 请输入字符串 以回车键结束:\n&); gets(b); //逐个比较直到两个字符不同或其中一个字符串结束 逐个比较直到两个字符不同或其中一个字符串结束 for(i=0; a[i] && b[i] ; i++) { if(a[i]!=b[i]) } if (a[i]&b[i]) printf(&第一个字符串 大!\n&, a); 第一个字符串%s 第一个字符串 else if (a[i]==b[i]) /* 定位第一个字符串的结束标志 定位第一个字符串的结束标志*/ /*将 s2 接到 s1 后*/ 将 printf(&两字符串相同!\n&); 两字符串相同! 两字符串相同 else printf(&第二个字符串 大!\n&, b); 第二个字符串%s 第二个字符串 }5. 编程:任意输入一个字符串保存在一维字符数组中,判断里面数字字符的个数。例如: 编程: Input a string: adg4521gadg4adg number: 5 #include &stdio.h& void main() { int i, n=0; char s[80]; printf(&请输入一个字符串以回车键结束 请输入一个字符串以回车键结束:\n&); 请输入一个字符串以回车键结束 gets(s); for(i=0 ; s[i]; i++) if(s[i]&='0' && s[i]&='9') n++; printf(&字符串中包含的数字个数为 字符串中包含的数字个数为:%d\n&,n); 字符串中包含的数字个数为 } 6. 编程:从一个字符串中删除从某个特定字符开始的所有字符。例如原字符串为&abcdefg&,特定字符为'd', 编程: 删除后的字符串为&abc&。 #include &stdio.h& void main() { int i, flag=0; char c, s[80]; printf(&请输入一个字符串以回车键结束 请输入一个字符串以回车键结束:\n&); 请输入一个字符串以回车键结束 gets(s); printf(&请输入特定字符:&); 请输入特定字符: 请输入特定字符 c=getchar(); for(i=0 ; s[i]; i++) if(s[i]==c) { s[i]='\0'; flag=1; } if(flag==0) printf(&输入字符中没有特定字符!\n&); 输入字符中没有特定字符 输入字符中没有特定字符! else puts(s); }7. 编程:编写程序,从一个输入的字符串中抽取一部分(从第 n 个字符开始,抽取 m 个字符)构成一个新 编程: 的字符串,并输出。要求:n 和 m 都由用户输入。 #include &stdio.h& #include &string.h& void main() { unsigned int i, j, m, char s1[80], s2[80]; printf(&请输入一个字符串以回车键结束 请输入一个字符串以回车键结束:\n&); 请输入一个字符串以回车键结束 gets(s1); printf(&请输入子串的起始位置和长度:&); 请输入子串的起始位置和长度: 请输入子串的起始位置和长度 scanf(&%d%d&, &n, &m); if( n&0 && n&=strlen(s1) ) { if (m&0 && n+m &= strlen(s1)+1 ) { for(i=n-1,j=0; s1[i] && i& n+m-1 ; i++, j++) s2[j]=s1[i]; s2[j]='\0'; puts(s2); } else printf(&长度超出范围 长度超出范围!\n&); 长度超出范围 } else printf(&起始位置超出范围 起始位置超出范围!\n&); 起始位置超出范围 } 8. 编程:利用字符串库函数 puts, gets, strcat, strcmp, strcpy, strlen 完成下述操作: 编程: 读入三个字符串 str1,str2,str3 输出这三个字符串 分别求出这三个字符串的长度; 比较 str1 和 str2 的大小; 将 str2 连接到 str1 之后,并输出连接后的 str1; 复制 str3 到 str1,并输出复制操作后的 str1; #include &stdio.h& #include &string.h& void main() { char str1[80], str2[80], str3[80]; printf(&请输入字符串 str1 以回车键结束 请输入字符串 以回车键结束:\n&); gets(str1); printf(&请输入字符串 str2 以回车键结束 请输入字符串 以回车键结束:\n&); gets(str2); printf(&请输入字符串 str3 以回车键结束 请输入字符串 以回车键结束:\n&); gets(str3); printf(&三个字符串分别是 三个字符串分别是:\n&); 三个字符串分别是 printf(&str1: %s\n&, str1); printf(&str2: %s\n&, str2); printf(&str3: %s\n&, str3); printf(&三个字符串的长度分别是 三个字符串的长度分别是:\n&); 三个字符串的长度分别是 printf(&str1: %d\n&, strlen(str1)); printf(&str2: %d\n&, strlen(str2)); printf(&str3: %d\n&, strlen(str3)); if(strcmp(str1, str2)&0) printf(&字符串 str1 大于 str2\n&); 字符串 else if(strcmp(str1, str2)==0) printf(&字符串 str1 等于 str2\n&); 字符串 else printf(&字符串 str1 小于 str2\n&); 字符串strcat(str1,str2); printf(& str2 连接到 str1 之后 之后: strcpy(str1,str3); } %s\n&,str1);printf(&复制 str3 到 str1: %s\n&,str1); 复制选作题: 选作题:输入一个小写字母组成的英文句子,统计该句子有几个英文单词, 统计每个字母出现的次数, 输入一个小写字母组成的英文句子,统计该句子有几个英文单词,并统计每个字母出现的次数,并将句子 中每个单词的首字母大写后输出。 中每个单词的首字母大写后输出。 如:输入: this is a cat! 输出: 4 个单词; 每个字母出现次数 t:2 This Is A Cat! #include &stdio.h& void main() { h:1 i:2 s:2 a:2 c:1 char s[80]; int count[26]={0}; int i, j, wordnum=0, flag=0; //与 26 个字母对应,统计各个字母出现的次数 与 个字母对应,printf(&请输入一个英文句子(小写字母)以回车键结束:&); 请输入一个英文句子(小写字母)以回车键结束: 请输入一个英文句子 gets(s); for(i=0; s[i]; i++) { if(s[i]&='a' && s[i]&='z') { j=s[i]-'a'; count[j]++; } if(i==0 && s[i]!=' ' || flag==1) { wordnum++; s[i]=s[i]-32; flag=0; } else if(s[i]==' ' && flag=1; //句首单词及每个单词第一个字母的处理 句首单词及每个单词第一个字母的处理 句首单词及每个 //单词个数增加 1 单词个数增加 //小写换大写 小写换大写 //逐个字母判断,使其对应的出现次数增加 1 逐个字母判断, 逐个字母判断 // 计算该字母在 26 个字母中的序号s[i+1]&='a' && s[i+1]&='z')//当前是空格,但下一个字符是字母,则该字母一定是单词的起始字母 flag=1。 当前是空格,但下一个字符是字母, 当前是空格 。 //即判断一个单词的起始字符,单词间用空格区分,这里考虑了单词间多个空格的情况 考虑了单词间 即判断一个单词的起始字符,单词间用空格区分,这里考虑了单词间多个空格的情况 } printf(&句子中有 个单词 句子中有%d 个单词;\n&, 句子中有 wordnum);printf(&每个字母出现的次数:&); 每个字母出现的次数: 每个字母出现的次数 for(i=0; i&26; i++) { if(count[i]!=0) printf(&%c: %d &, i+'a', count[i]); } printf(&\n&); printf(&每个单词首字母大写后:&); 每个单词首字母大写后: 每个单词首字母大写后 puts(s); }
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。}

我要回帖

更多关于 java 读入字符串 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信