У меня есть предыдущий опыт работы с Python, но я абсолютный новичок в C. Я работаю над инициалами CS50x pset2 (менее удобными), где простая программа на C должна принимать имя, данное пользователем, и распечатайте его инициалы имени.
Когда я запускаю программу, кажется, что она работает в некоторых ситуациях, но для некоторых имен добавляется неправильный символ «B» в конце. Вот код:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
string get_initials(string name, char initials[]);
int main(void)
{
// user input (full name)
printf("Please type your name: ");
string name = get_string();
// get the user name initials
char initials[10];
get_initials(name, initials); // in: full name; out: initials
printf("Initials: %s\n", initials);
}
string get_initials(string name, char initials[])
{
int counter = 0;
// Iterate over all characters
for (int i = 0, n = strlen(name); i < n; i++)
{
// in case the i-th char is ' ', appends next char to the initials array
if (name[i] == ' ')
{
initials[counter] = name[i+1];
counter++;
}
// appends the first char to the initials array
else if (i == 0)
{
initials[counter] = name[i];
counter++;
}
}
return initials;
}
А вот несколько выходов Терминала:
~/workspace/pset2/ $ ./initials
Please type your name: John Smith
Initials: JSB
~/workspace/pset2/ $ ./initials
Please type your name: John Smith Here
Initials: JSH
~/workspace/pset2/ $ ./initials
Please type your name: John
Initials: J
~/workspace/pset2/ $ ./initials
Please type your name: John Smith Here Again
Initials: JSHAB
~/workspace/pset2/ $ ./initials
Please type your name: John Smith Here Again Where
Initials: JSHAW
~/workspace/pset2/ $ ./initials
Please type your name: John Smith Here Again Where Here
Initials: JSHAWH
~/workspace/pset2/ $
Я отлаживал "John Smith", но до сих пор не могу понять, почему добавляется < strong> S \ 320 \ 330B, а не просто S.
string
. - person haccks   schedule 17.08.2017typedef char* string
как часть библиотеки cs50.h, с которой обучают новичков. Да, люди, которые разработали этот дерьмовый курс, действительно были настолько глупы. - person Lundin   schedule 17.08.2017char
, содержащий символ'\0'
, обозначающий конец строки.initials
нет. - person alk   schedule 17.08.2017initials[counter] = '\0';
в конец функции, и это сработало - person carlos_fab   schedule 17.08.2017char
-массив для всех0
s:char initials[10] = "";
(что то же самое, что иmemset(initials, 0, 10);
) - person alk   schedule 17.08.2017