首页 > 解决方案 > 以特定方式打印名称

问题描述

我必须编写一个代码,打印出第一个姓氏,如下所示:Smith, A.

到目前为止,我已经尝试了各种技术,并且不小心创建了一个我相信的无限“for”循环,尽管我不是 100% 确定我是如何做到的。这是专门针对 C 语言的,我对这门语言比较陌生,尽管阅读了教科书,但显然对字符在数组中的工作方式并没有很好的理解。这可能是一个简单的问题,我想多了。这是我到目前为止所写的,不包括代码的不必要方面(即定义)

更新代码

int main(void)
{
  char name, letter;
  char fname[MAX], lname[MAX];
  int countf, countl, i, j;

  printf("Enter a first and last name: ");
  countf = 0;
  countl = 0;
  while ((name = getchar()) != ' ') {
      fname[countf++] = name; 
  }

  while ((name = getchar()) != '\n') {
      lname[countl++] = name;
  }

 for(i=0;i < sizeof(lname);i++) {
     putchar(lname[i]);
 }
 printf(", ");
 putchar(fname[0]);
 printf(".");

  return 0;
}

我仍然有一些随机和不必要的变量。当前输出是 Smith(symbol)t(symbol)~(two symbols), A." 我不知道如何摆脱这些毛刺

标签: carrayscharacter

解决方案


您必须在有效数据的末尾停止输出姓氏,而不是在数组的末尾:

for( i = 0; i < countl; i++ )
//              ^^^^^^

这修复了您的代码,但是您使问题复杂化了。当您只需要存储第一个字母时,您不必要地存储输入。然后,您可以简单地丢弃其余的名字,并在最终输出存储的第一个字母之前直接输出姓氏 - 因此:

int main( void )
{
    printf( "Enter a first and last name: " );

    // Keep first letter to output last.
    char letter = getchar() ;

    // Discard the rest of the first name
    while( getchar() != ' ' )
    {
       // Do nothing until SPACE
    }

    // Output the last name
    int namech = 0 ;
    while( (namech = getchar()) != '\n' )
    {
        putchar( namech ) ;
    }
    printf( ", " );

    // Output the first letter
    putchar( letter ) ;
    printf( "." );

    return 0;
}

这具有不受任何缓冲区溢出问题的明显优势 - 因为没有缓冲区。


推荐阅读