Вывести имя определенным образом

#c #arrays #character

#c #массивы #символ

Вопрос:

Я должен составить код, который выводит имя и фамилию следующим образом: 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 (символ) t (символ) ~ (два символа), A.»Я не уверен, как избавиться от сбоев

Комментарии:

1. Я думаю, вы неправильно поняли некоторые основы. fname[name] не имеет смысла, так как это привело бы к доступу к n-му символу в fname , а затем ничего с ним не делало. Также, n в данном случае это ASCII-код введенного символа. Вы, наверное, хотели fname[countf ] = name; .

2. Обратите внимание, что fname[name]; это ничего не делает, и даже если бы это произошло, неправильно индексировать по введенному символу. Причина, по которой вы получаете странные результаты, заключается в том, что массивы неинициализированы, и в них никогда не записываются данные.

3. Инструкции fname[name]; и lname[name]; не имеют смысла. Во-первых, name используется в качестве индекса в этих массивах, но name является символом, а не индексом массива. И, кроме того, предполагая, что индексация не вызывает ошибки сегментации, инструкции ничего не делают. Это доступ к переменным, и их значения просто сбрасываются на пол.

4. Оф ок, это большая ошибка с моей стороны. Я думал, что это поместит символ внутри массива по какой-то причине @ThiefMaster и @Weather Vane . Я попробовал то, что вы сказали @user3121023, но не получаю «ASCIIIL (symbol) t (symbol) ~ (symbols), `.» в качестве вывода

5. @Clifford Я исправил код, извините за это, должно быть, была ошибка при копировании вставки

Ответ №1:

Вы должны прекратить вывод последнего имени в конце допустимых данных, а не в конце массива:

 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;
}
  

Это имеет явное преимущество в том, что оно защищено от любых проблем с переполнением буфера — потому что буфера нет.