简单LinuxC程序关于实现识别字符串中合法的帧(字符串输入)
2017-07-11 20:21
211 查看
题目: 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.
例如:帧头和帧尾分别是head和tail 字符串”hdbchddheadhfdjhfdtailvcgbfgby”中headhfdjhfdtail是合法帧。
解析:在我看来,该题目有两种理解方式。一种是字符串中第一个tail作为帧尾,源代码如下:
#include <stdio.h> #include <string.h> #define MAX 100 int head_tail (char ch[],char head[],char tail[]) { int strl1 = strlen(ch); int strl2 = strlen(head); int strl3 = strlen(tail); int temp_head,temp_tail; int i,j; for (i = 0; i < (strl1 - strl2); i++) { for (j = 0; j < strl2; j++) { if (ch[i + j] != head[j]) //比较字符串和帧头 { break; } } if (j == strl2) //判断字符串中有没有帧头 { temp_head = i; //记录下帧头的位置 for (i = i + j; i < (strl1 - strl3); i++) { for (j = 0; j < strl3; j++) { if (ch[i + j] != tail[j]) //比较字符串和帧尾 { break; } } if (j == strl3) //判断字符串中有没有帧尾 { temp_tail = i + j; //记录下帧尾的位置 printf ("legal string is :"); for (i = temp_head; i < temp_tail; i++ ) { printf ("%c",ch[i]); //输出合法帧 } return 0; } } printf ("can not find the %s",tail); //找不到帧尾 return 0;; } } printf ("can not find the %s",head); //找不到帧头 return 0; } int main() { char ch[MAX]; char head[MAX]; char tail[MAX]; int i = 0; printf ("input a string:"); fgets (ch,MAX,stdin); /*使用scanf时,一旦遇到空格,就会认为是下一次的输入,这样就无法 从键盘上获取带空格的字符串,使用gets()或fgets(),而gets()会无限 读取键入的数据,所以有很大的风险。使用fgets()比较安全,第一个参 数是字符型指针,指向用来存储所得数据的地址;第二个参数是整型数 据,指明存储数据的大小;第三个参数是文件结构体指针,将要读取的 文件流,这里的stdin是标准输入*/ printf ("input a head string:"); fgets (head,MAX,stdin); while (head[i] != '\0') { if (head[i] == '\n') { head[i] ='\0'; } i++; } /*fgets()会将换行符也读入,而我们显然不希望字符串中有换行符, 使用以上代码可将换行符换成'\0',作为字符串的结尾*/ i = 0; printf ("input a tail string:"); fgets (tail,MAX,stdin); while (tail[i] != '\0') { if (tail[i] == '\n') { tail[i] ='\0'; } i++; } head_tail (ch,head,tail); printf("\n"); return 0; }
另一种是字符串最后一个tail作为帧尾,源代码如下:
#include <stdio.h> #include <string.h> #define MAX 100 int head_tail (char ch[],char head[],char tail[]) { int strl1 = strlen(ch); int strl2 = strlen(head); int strl3 = strlen(tail); int temp_head,temp_tail; int i,j; int flag = 0; for (i = 0; i < (strl1 - strl2); i++) { for (j = 0; j < strl2; j++) { if (ch[i + j] != head[j]) { break; } } if (j == strl2) { temp_head = i; for (i = i + j; i < (strl1 - strl3); i++) { for (j = 0; j < strl3; j++) { if (ch[i + j] != tail[j]) { break; } } if (j == strl3) { temp_tail = i + j; flag = 1; } } if (flag == 1) //判断是否找到帧尾,此时如果找到,temp_tail保存的是最后一个tail的位置 { printf ("legal string is :"); for (i = temp_head; i < temp_tail; i++ ) { printf ("%c",ch[i]); } return 0; } printf ("can not find the %s",tail); return 0; } } printf ("can not find the %s",head); return 0; } int main() { char ch[MAX]; char head[MAX]; char tail[MAX]; int i = 0; printf ("input a string:"); fgets (ch,MAX,stdin); printf ("input a head string:"); fgets (head,MAX,stdin); while (head[i] != '\0') { if (head[i] == '\n') { head[i] ='\0'; } i++; } i = 0; printf ("input a tail string:"); fgets (tail,MAX,stdin); while (tail[i] != '\0') { if (tail[i] == '\n') { tail[i] ='\0'; } i++; } head_tail (ch,head,tail); printf("\n"); return 0; }
需要注意的是,使用scanf时,一旦遇到空格,就会认为是下一次的输入,这样就无法从键盘上获取带空格的字符串,使用gets()或fgets(),而gets()会无限读取键入的数据,所以有很大的风险。使用fgets()比较安全,第一个参数是字符型指针,指向用来存储所得数据的地址;第二个参数是整型数据,指明存储数据的大小;第三个参数是文件结构体指针,将要读取的文件流,这里的stdin是标准输入。fgets()会将换行符也读入,而我们显然不希望字符串中有换行符,使用一些方法(前文代码中有)可将换行符换成'\0',作为字符串的结尾。
字符串的结尾是一个重点,在很多的编程中都要涉及,处理不好字符串的结尾,肯定无法处理好字符串。
相关文章推荐
- 简单LinuxC程序关于任意长整数相加(字符串实现)
- 判断输入的字符串是否为合法IP地址的程序
- 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来. 提示:帧头和帧尾分别是head和tail 字符串”asdheadhauboisoktail”中headhaubo
- Linux_C练习:输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来。提示:帧头和帧尾分别是head和tail 字符串”asdheadhauboisoktai
- 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.
- 用java编写一个简单的字符串加密解密程序,将字符串分成若干行,实现字符串以一列一列读取,并还原之前输入的字符串。这里实现4行输出。
- 关于汇编的基本小程序——将输入字符串中的小写字母转换成大写字母并输出
- 【嵌入式系统学习记录】习题:输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来。比如:帧头和帧尾分别是head和tail 字符串”asdheadhauboiso
- 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来. 提示:帧头和帧尾分别是head和tail 字符串”asdheadhauboisoktail”中headhau
- 编写一个程序 输入字符串 直到遇到NULL 实现字符串的首字母排序(图)
- 4.5题目: 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.
- C语言关于字符串中字母大写换小写,小写换大写的实现程序
- 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.
- 一个简单的关于字符串识别与转换的程序
- 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来. 提示:帧头和帧尾分别是head和tail 字符串”asdheadhauboisoktail”中headhau
- 简单LinuxC程序关于实现从终端获取一条语句并统计各种字符数量(字符输入输出)
- 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.
- 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来。
- 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.
- 简单LinuxC程序关于实现进制转换