第七章 字符串处理

来源:互联网 发布:电信4g网络不支持短信 编辑:程序博客网 时间:2024/07/24 02:33
第七章 字符串处理
一、大纲
掌握字符数组的定义和使用 
掌握字符串处理的函数
二、实验目标:
掌握字符数组的定义,初始化,\0的作用,以及输入输出操作。
掌握字符串处理函数的使用,理解这些函数的作用以及使用方法。
三、实验方式:
  要求学生自己独立完成
四、任务
4.1任务1:字符串处理(时间:25分钟)
4.1.1 任务描述
从键盘上接收一个字符串,保存到一个字符数组中。
然后从后面往前倒序输出这个字符串。例如:接收字符串为:“Jone”,则输出结果为“enoJ”。
#include <stdio.h>
#include<string.h>


int main(){
    char str[50];
    printf("请输入字符串:\n");
    fflush(stdout);
    gets(str);
    int i=0;
       for(i=strlen(str);i>=0;i--){
           printf("%c", str[i]);
       }


    return 0;
}
4.1.2 任务目的
掌握字符数组的定义,初始化和存储格式(\0的位置)。
掌握使用gets进行字符串输入操作。
掌握字符串处理函数的使用。
灵活使用循环进行字符串输出操作。
4.1.3 任务要求
要求在定义字符数组时,需要使用memset进行清零操作。
要求在输出时,只输出用户输入的字符串,不要输出\0等空字符。
给出适当的提示信息和注释信息。
4.1.4 难点提示
提示:
  程序开始时可以通过定义一个足够大的字符数组来保存字符串。
  在输出时考虑到字符数组可能只有前几位是有效位,例如:用户输入“Jone”,则字符数组中前4位是有效的字符,而从第5位到最后都为\0,因此在倒序输出时,我们只要从字符数组的第4位开始向前输出即可,而后面的\0我们没有必要去输出它(输出\0可能为空字符,也可能为乱码,这是由编译器决定的。),可以通过使用strlen()取得字符串的长度。
4.2任务2:字符串处理2(时间:15分钟)
4.2.1 任务描述
分别使用char数组和string类对象实现下面任务:
编写一个程序,首先要求用户输入姓,然后输入名,然后使用一个逗号和空格将姓和名组合在一起,并存储和显示组合好的结果和结果的长度。下面是程序运行时的情形:
Enter your first name: Li
Enter your last name: Ming
The name is: Li, Ming
The length of name: 8




#include <stdio.h>
#include <stdlib.h>


int main(void) {
char first[12];
char last[24];
puts("Enter your first name: ");
fflush(stdout);
gets(first);
puts("\nEnter your last name: ");
fflush(stdout);
gets(last);
strcat(first, ", ");
strcat(first, last);
printf("\nThe name is: %s", first);
printf("\nThe length of name: %d", strlen(first));
return EXIT_SUCCESS;
}
4.2.2 任务目的


掌握字符数组的定义,以及使用memset进行初始化。
字符串的输入和输出。
掌握常用的几个字符串处理函数的使用。
4.2.3 任务要求
按照上面方块中程序运行情况进行程序设计。
程序中的标识符要有具体的意义,不要用类似于a,b,c这样的标识符为变量或数组起名。
为程序添加适当的注释信息。
4.2.4 难点提示
4.3任务3:字符串处理3(时间:15分钟)
4.3.1 任务描述
从键盘上接收一个字符串,并统计其中字符的个数。




#include <stdio.h>
#include<string.h>


int main(){
   /*char str[10]="";
  printf("请输入字符串:\n");
  fflush(stdout);
  gets(str);
  printf("%d",strlen(str));*/


char st[100];
   int i,num=0;
   char c;
   printf("请输入字符串:\n");
   fflush(stdout);
   gets(st);
   puts(st);
   for(i=0;c=st[i]!='\0';i++)
   {
       num++;
   }
   printf("字符数为:%d\n",num);
 return 0;
}


4.3.2 任务目的
掌握字符串的输入
掌握字符串的访问和比较
4.3.3 任务要求
注意不能使用strlen函数完成实现。
为程序添加适当的注释信息。
4.3.4 难点提示

4.4 作业1(15分钟)
4.4.1 作业任务
按照下面要求完成程序:
定义一个char数组address,使用memset对它进行初始化。
从键盘上接收一个字符串,保存到address中。
再从键盘上接收一个字符保存到字符变量findChar中。
要求从address中查找是否有字符findChar,输出找到的次数。例如:字符串为“ABCDEDS”,如果要查找字符‘D’,则应该输出2;如果要查找字符‘X’,则需要输出没有找到。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i=0,num=0;
char address[1024],finalChar;
memset(address,'\0',1024);
puts("请输入一个字符串:\n");
fflush(stdout);
gets(address);
puts("请输入一个字符");
fflush(stdout);
finalChar=getchar();
for(;i<strlen(address);i++){
if(address[i]==finalChar){
num++;
}


}
if (num == 0) {
printf("字符串  %s 中不存在字符  %c。", address, finalChar);
} else {
printf("字符串  %s 中共有字符  %c %d 个。", address, finalChar, num);
}
return EXIT_SUCCESS;
}
4.4.2 任务要求
注意:单个字符的比较使用“= =”即可。而只有进行字符串比较时才使用“strcmp”。
4.5 作业2(20分钟)
4.5.1 作业任务
定义一个包含有5个元素的int数组,并且初始化为0;
从键盘上接收5个整数,依次保存到int数组中。
要求你想办法,把数组的元素值倒序过来存储。例如:从键盘上接收数据后,数组元素存储的顺序依次为:
10 20 3022 35
  则在做完操作后使数组元素存储的顺序应该为:
35 22 3020 10
完成倒序存储操作后,输出数组所有元素的值。
#include <stdio.h>
#include <stdlib.h>
int main(void) {


int intvar[5] = { 0 };
printf("请输入五个整数:\n");
fflush(stdout);
scanf("%d%d%d%d%d", &intvar[0], &intvar[1], &intvar[2], &intvar[3],
&intvar[4]);
int i = 0;
int length = sizeof(intvar) / sizeof(int);
for (; i < length / 2; i++) {
int temp = 0;
temp = intvar[i];
intvar[i] = intvar[length - i - 1];
intvar[length - i - 1] = temp;
}
printf("%d,%d,%d,%d,%d", intvar[0], intvar[1], intvar[2], intvar[3],
intvar[4]);


return EXIT_SUCCESS;
}


4.5.2 任务要求
交换的过程可以参照下面两种算法中的一个完成实现:(也可以自己想办法进行完成实现)
方法一:
使用循环语句,分别使第一个元素与最后一个元素进行交换,然后是第二个元素与倒数第二个元素进行交换。以此类推,完成所有元素的交换。
方法二:
重新定义一个新的数组,将原数组按倒序的方式将元素赋值到新数组中,如下面所示:


10 20 3022 35




35 22 3020 10


然后将新数组中元素按照正常的顺序重新赋值到原数组中,即可完成原数组元素交换的过程,如下面所示:


35 22 3020 10




35 22 3020 10


要求:使用循环的方式完成交换操作,程序应该是一个有通用的程序,即对任何int数组均有效,而不仅仅是只对长度为5的数组有效。


五、课后作业


5.1作业一(15分钟)
5.1.1作业任务
从键盘输入一行字符串,再输入一个字符,判断后输入的字符在前面字符串中出现的次数,若没有则输出此字符不存在。
#include <stdio.h>
#include<string.h>


int main(){
    char str[50];
    printf("请输入字符串:\n");
    fflush(stdout);
    gets(str);
    int i=0;
       for(i=strlen(str);i>=0;i--){
           printf("%c", str[i]);
       }


    return 0;
}




5.1.2任务要求
(1)输入输出应有提示信息。
(2)利用if语句


5.1.3任务难点
(1)判断字符相等可利用==。
(2)可定义一个int类型的变量累加字符出现的个数。


5.2作业二(15分钟)
5.2.1作业任务
输入一行字符,统计其中单词的个数,输入的单词之间用空格隔开。
#include<stdio.h>int main(){int i=0;char a;printf ("请输入:\n");fflush(stdout);while ((a = getchar ()) != '\n'){if (a == ' ')i++; }printf ("输出\n");printf("%d\n\n",i + 1);return 0;}




5.2.2任务要求
(1)输入输出应有提示信息。


5.2.3任务难点
(1)输入单词时利用gets方法,scanf()不能读空格。
(2)判断单词个数时利用字符的结束标志为\0


5.3作业三(20分钟)
5.3.1作业任务
编写一个程序,将字符数组上s2中的全部字符复制到字符数组s1中。
(1) 方法一:应用strcpy函数。
(2) 方法二:不应用strcpy函数。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>


int main(void) {


char s1[10]={'a','b','c'};
char s2[10]={'d','e','f'};
//方法一
//strcpy(s1,s2);
//方法二
int len=sizeof(s2)/sizeof(char);
int i=0;
for(;i<len;i++){
s1[i]=s2[i];
}




printf("%c%c%c",s1[0],s1[1],s1[2]);
return 0;
}


5.3.2任务要求
(1)输入输出有提示信息
(2)方法一主要掌握strcpy的用法
(3)方法二注意两字符串的长度,即s1和s2的长度。


5.3.3任务难点
(1)数组赋值应单个元素赋值,即s1[i]=s2[i]。
(2)字符串的结束标志是\0.
(3)注意引入string.h库文件


5.4作业四(20分钟)
5.4.1作业任务
编写一程序,将两个字符串连接起来,s1接在s2的后面。 
(1) 方法一:应用strcat函数。
(2) 方法二:不应用strcat函数。
#include <stdio.h>
#include <stdlib.h>


int main(void) {
char s1[]="people";
char s2[]="china";


printf("%s",strcat(s1,s2));


}


5.4.2任务要求
(1)输入输出有提示信息
(2)方法一主要掌握strcat的用法


5.4.3任务难点
(1)注意s2数组的长度,应大于s1和s2数组中字符个数的和。
(2)注意s2字符串的结束标志为\0,s1赋值时应把\0覆盖掉。
(3)注意引入string.h库文件
(4)数组赋值应单个元素赋值。


5.5作业五(15分钟)
5.5.1作业任务
应用二维数组数组输出棱形,(提示,*是字符)
       *
     *** 
   *****
     ***
       *#include <stdio.h>
#include <stdlib.h>


int main(void) {


  int i,j,k,l;
  for(i=3,l=1;i>0;i--,l++)
  {for(j=1;j<i;j++)
   printf("  ");
  for(k=1;k<=2*l-1;k++)
  printf(" *");
  printf("\n");
}
  for(i=1,l=2;i<3;i++,l--)
  {for(j=0;j<i;j++)
  printf("  ");
  for(k=1;k<=2*l-1;k++)
   printf(" *");
  printf("\n");
  }
  return 0;
}
5.5.2任务要求
(1)输入输出,应有提示信息。
5.5.3任务难点