您的位置:首页 > 运维架构 > Linux

简单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语言
相关文章推荐