1

我有以下问题:-

编写一个程序,获取用户输入的名字和姓氏,并显示姓氏、逗号和第一个首字母,后跟一个句点:

用户的输入可能在名字之前、名字和姓氏之间以及姓氏之后包含额外的空格。

我为它编写了这样的代码:

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

int main(void)
{
    int i=0,j=0;
    char name[100];
    gets(name);

    while( name[i] == ' ' || name[i] == '\t' )
        i++;

    while( *(name+i) != ' ' && *(name+i)!= '\t' )
        i++;

    while(name[i] == ' '|| name[i] == '\t')
        i++;

    while( *(name+i) != ' ' && *(name+i) != '\t' && *(name+i) != '\0' )
        putchar(name[i++]);
        putchar(',');

    while( name[j] == ' '|| name[j] == '\t' )
        j++;

    while( *(name+j) != ' ' && *(name+j) != '\t' )
      {
        putchar(name[j++]);
        break;
      }
        putchar('.');
        return 0;
}

虽然它正在工作,但它似乎在某种程度上是不可接受的。我该如何改进它?

4

2 回答 2

2

避免使用gets()和使用fgets()

从手册页:

错误

永远不要使用gets()。因为在事先不知道数据的情况下不可能知道gets()会读取多少个字符,并且因为gets()会继续存储超过缓冲区末尾的字符,所以使用起来非常危险。它已被用来破坏计算机安全。请改用 fgets()。

编辑

您可以使用 ctype.h 中的 isalpha、isspace 函数来最小化您的代码。

isspace() :检查空白字符。在“C”和“POSIX”语言环境中,它们是:空格、换页符 ('\f')、换行符 ('\n')、回车符 ('\r')、水平制表符 ('\t' ) 和垂直制表符 ('\v')。

isalpha() :检查字母字符;在标准的“C”语言环境中,它等价于 (isupper(c) || islower(c))。在某些语言环境中,可能有其他字符 isalpha() 是既不是大写也不是小写的真正字母。

您可以使用此重构代码或代码的任何部分。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_LENGTH 100


int main(void)
{
   int i=0,j=0;
   char name[MAX_LENGTH];

   fgets(name,MAX_LENGTH,stdin); //instead of gets(name); 

   for(i=0;i<strlen(name) ;i++)   //loop to capture initial ,after this you have initial name[i]
         if(isalpha(name[i]))
                break;

   for(j=i;j<strlen(name);j++)    //loop to find  start of  last name
        if(isspace(name[j]))
             if(isalpha(name[j+1]))
                     break;

    for(j=j+1;j<strlen(name);j++) //loop to print last name on screen
             if(isalpha(name[j]))
                  putchar(name[j]);
             else
                  break;

         putchar(',');                
         putchar(name[i]);           //print initial
         putchar('.');

         printf("\n");
  return 0;

 }
于 2013-09-10T14:50:10.933 回答
1

您可以使用 sscanf 对其进行一点压缩:

#define MAX_LENGTH 100
...
char name[MAX_LENGTH];
char surname[MAX_LENGTH];
char firstname[MAX_LENGTH];
fgets( name, MAX_LENGTH, stdin ); 
if ( sscanf( name, "%s %s", firstname, surname ) == 2 )
{
  printf( "%s, %c.\n", surname, firstname[0] );
}
于 2013-09-10T16:23:17.407 回答