CS50 (pset2) - поведение, непонятное в программе C, которая распечатывает инициалы

У меня есть предыдущий опыт работы с 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.


person carlos_fab    schedule 17.08.2017    source источник
comment
Вы получаете это, потому что CS-50 полностью не учит, как работают строки на языке C. Все строки должны оканчиваться нулем. Вы не завершаете строку инициалов нулем должным образом. Решение состоит в том, чтобы получить лучший источник обучения.   -  person Lundin    schedule 17.08.2017
comment
В C. нет типа данных string.   -  person haccks    schedule 17.08.2017
comment
@haccks В курсе CS-50 есть один. Они сделали typedef char* string как часть библиотеки cs50.h, с которой обучают новичков. Да, люди, которые разработали этот дерьмовый курс, действительно были настолько глупы.   -  person Lundin    schedule 17.08.2017
comment
@Lundin; люди, которые разработали этот дерьмовый курс, действительно были настолько глупы: Не могу с этим согласиться.   -  person haccks    schedule 17.08.2017
comment
C-строка - это просто массив char, содержащий символ '\0', обозначающий конец строки. initialsнет.   -  person alk    schedule 17.08.2017
comment
Спасибо за ответ! просто вставил initials[counter] = '\0'; в конец функции, и это сработало   -  person carlos_fab    schedule 17.08.2017
comment
Если лениво отслеживать конец строки, альтернативный, немного неэффективный подход - инициализировать char-массив для всех 0s: char initials[10] = ""; (что то же самое, что и memset(initials, 0, 10);)   -  person alk    schedule 17.08.2017


Ответы (1)


В конце функции get_initials завершите строку:

...
initials[counter] = '\0';
return initials;
person Lundin    schedule 17.08.2017
comment
Спасибо за ответ! просто вставил initials[counter] = '\0'; в конец функции, и все заработало! - person carlos_fab; 17.08.2017