#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;
}
Это имеет явное преимущество в том, что оно защищено от любых проблем с переполнением буфера — потому что буфера нет.