创建电子邮件地址表单名称
您提供的文件包含多个人的姓名。该文件每行只有一个名称。您需要从这些名称创建以@bitmesra.ac.in结尾的电子邮件地址。 创建电子邮件地址的规则定义如下:名称将以下列形式表示: ............
设F(s)表示字符串s的第一个字符。 所以,电子邮件ID将是F(字符串1) F(字符串2) ........._ lastString@bitmesra.ac.in 下面列出了一些名称及其相应的电子邮件ID
Sachin Ramesh Tendulkar s_r_tendulkar@bitmesra.ac.in Rahul S Dravid r_s_dravid@bitmesra.ac.in
你需要为此生成一个语法。
注意:b / w名称可能有多个空格。
我的代码在这里
#include<cstdio>
#include<cstring>
#include<cctype>
int main()
{
char str1[100],str2[100];
char str3[] = "@bitmesra.ac.in";
while(gets(str1))
{
int index,k=0;
str2[k] = tolower(str1[0]);
for(int i=1;i<strlen(str1);i++)
{
if(str1[i]==' ')
{
index = i;
if(isalpha(str1[i+1]))
{
k++;
str2[k] = '_';
k++;
str2[k] = tolower(str1[i+1]);
}
}
}
index= index + 2;
for(int i=index;str1[i]!='\0';i++)
{
k++;
str2[k] = tolower(str1[i]);
}
str2[++k] = '\0';
strcat(str2,str3);
printf("%s\n",str2);
}
return 0;
}
如何编写CFG语法为此.....
答案 0 :(得分:1)
如下:
optnamelist: /* file can be empty */
| namelist /* do nothing */
namelist: nameseq NL /* process vector */
| namelist NL nameseq /* process vector */
nameseq: name /* create vector and add element 1 */
| nameseq name /* add element to vector */
词法分析者应该照顾白色空间(吃掉它们)。 NL令牌是一个或多个换行符的序列。 如果将名称添加到矢量的末尾,则必须向后处理它。 您的代码暗示您在C中编写此代码。因此您可以使用固定大小的Vector,例如
#define MAX_NAMES 100 /* this will probably be enough :-) */
static int actpos;
static char *myVector[MAX_NAMES];
...
/* "create" vector */
memset(myVector, 0, MAX_NAMES * sizeof(char *));
actpos = 0;
...
/* add name to vector */
myVector[actpos] = strdup($1 /* or $2 */);
if (myVector[actpos) == NULL) ... /* out of memory */
actpos++;
if (actpos >= MAX_NAMES) ... /* name too long */
...
/* process vector */
for (i = actpos - 1; i > 0; --i) {
/* add myVector[i][0] to e-mail address */
free(myVector[i]);
}
/* add myVector[0] to e-mail address */
free(myVector[0]);