1 Востаннє редагувалося pika1989 (16.10.2015 11:55:32)

Тема: Функції strcat та strcat_s

Задача: Вводиться послідовність N слів. Утворити рядок із :
o        всіх введених слів,  слова у створюваному тексті розділити пропусками(чи комами);
o        слів, що мають однакові першу і останню букви;
o        всіх слів, відкидаючи першу та  останню букви слів.
Використати бібліотечні функції strcat(), strncat().

Реалізувала так:

Прихований текст
#include <iostream>
#include <cstring>

using namespace std;

void concatAllWords(char *word, char *rezult)
{
    strcat(word, " ");
    strcat(rezult, word);

}

void concatWordsWithoutLetters(char *word, char *rezult)
{
    int length_copy = strlen(word) - 3;
    strncat(rezult, word + 1, length_copy);
    strcat(rezult, " ");
}

void concatWordsWithSameLetters(char *word, char *rezult)
{
    if (word[0] == word[strlen(word) - 2])
    {
        strcat(rezult, word);
        strcat(rezult, " ");
    }
}


int main()
{
    const int TEMP_LENGTH = 20, STRING_LENGTH = 256;
    
    int number_words;
    cout << "Enter number of words: ";
    cin >> number_words;

    char temp_word[TEMP_LENGTH] = "\0";
    char all_words[STRING_LENGTH] = "\0";
    char words_without_first_last_letters[STRING_LENGTH] = "\0";
    char words_with_same_first_last_letters[STRING_LENGTH] = "\0";

    while (number_words)
    {
        cout << "Enter word: ";
        cin >> temp_word;
        concatAllWords(temp_word, all_words);
        concatWordsWithoutLetters(temp_word, words_without_first_last_letters);
        concatWordsWithSameLetters(temp_word, words_with_same_first_last_letters);    
        --number_words;
    }

    cout << "\nString with all input words: \n\t" << all_words << "\n";
    cout << "\nString without first and last letters in each word: \n\t" << words_without_first_last_letters <<"\n";
    cout << "\nString with same first and last letters in each word: \n\t" << words_with_same_first_last_letters << "\n";

    return 0;
}

Але проблема в тому, що коли всі етапи задачі реалізовані лише в main(), то програма працює і я можу без проблем використовувати функцію strcat_s. Проте, коли хочу структурувати програму, розбити на функції, то, при використанні strcat_s, видає помилку:

Прихований текст

IntelliSense: no instance of overloaded function "strcat_s" matches the argument list
            argument types are: (char *, const char [2])

відповідно, у коді strcat_s замінюю на strcat і у відповідь знову ж таки помилка:

Прихований текст

Error    1    error C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

Можливо, це пов'язано з тим, що я рядки передаю через вказівники, не знаю. Допоможіть, будь ласка, розібратись.

2 Востаннє редагувалося koala (16.10.2015 12:23:25)

Re: Функції strcat та strcat_s

З телепатами тут не дуже, щоб порівнювати наявний код із ненаведеним, але:
- strcat не перевіряє, чи достатньо місця в місці призначення, тому може призвести до проблем і його не рекомендується використовувати (друге повідомлення);
- strcat_s вимагає додаткового параметра - розмір рядка-призначення (перше повідомлення).

3 Востаннє редагувалося pika1989 (16.10.2015 13:14:55)

Re: Функції strcat та strcat_s

Ось код програми, коли всі етапи задачі реалізовані лише в main(), з використанням функції strcat_s

Прихований текст
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    const int TEMP_LENGTH = 20, STRING_LENGTH = 256;

    int number_words;
    cout << "Enter number of words: ";
    cin >> number_words;

    char temp_word[TEMP_LENGTH] = "\0";
    char all_words[STRING_LENGTH] = "\0";
    char words_without_first_last_letters[STRING_LENGTH] = "\0";
    char words_with_same_first_last_letters[STRING_LENGTH] = "\0";

    while (number_words)
    {
        cout << "Enter word: ";
        cin >> temp_word;
        
        strcat_s(all_words, temp_word);
        strcat_s(all_words, " ");

        int length_copy = strlen(temp_word) - 2;
        strncat_s(words_without_first_last_letters, temp_word + 1, length_copy);
        strcat_s(words_without_first_last_letters, " ");

        if (temp_word[0] == temp_word[strlen(temp_word) - 1])
        {
            strcat_s(words_with_same_first_last_letters, temp_word);
            strcat_s(words_with_same_first_last_letters, " ");
        }   
        
        --number_words;
    }

    cout << "\nString with all input words: \n\t" << all_words << "\n";
    cout << "\nString without first and last letters in each word: \n\t" << words_without_first_last_letters << "\n";
    cout << "\nString with same first and last letters in each word: \n\t" << words_with_same_first_last_letters << "\n";

    return 0;
}

І вона робоча.

4 Востаннє редагувалося Yola (16.10.2015 13:43:32)

Re: Функції strcat та strcat_s

У main ви використовуєте перевантаження strcat_s, яке є шаблоном що приймає рядки виду char[SIZE], це зовсім не те саме, що char*.

Тут

void concatAllWords(char *word, char *rezult)

губиться інформація про розмір рядка.

Можливо вам варто спробувати так:

void concatAllWords(char *word, char *rezult)
{
    strcat_s(word, TEMP_LENGTH, " ");
    strcat_s(rezult, STRING_LENGTH, word);
}

Але це не дуже гарно виглядає :(

5

Re: Функції strcat та strcat_s

Yola написав:

У main ви використовуєте перевантаження strcat_s, яке є шаблоном що приймає рядки виду char[SIZE], це зовсім не те саме, що char*.

Тут

void concatAllWords(char *word, char *rezult)

губиться інформація про розмір рядка.

тобто, мені можна прописати таким чином:

template <int size>
void concatAllWords(char word[size], char rezult[size])

?

6

Re: Функції strcat та strcat_s

Якщо розміри однакові, то

template <int size>
void concatAllWords(char (&word)[size], char (&rezult)[size])
Подякували: pika19891

7

Re: Функції strcat та strcat_s

Дякую, зробила так:

template <int size1, int size2>
void concatAllWords(char (&word[size1]), char (&rezult[size2]))
{
    strcat_s(word, " ");
    strcat_s(rezult, word);

}

Так добре?

8 Востаннє редагувалося Yola (16.10.2015 14:13:27)

Re: Функції strcat та strcat_s

Так, тільки можна

template <size_t size1, size_t size2>

Зверніть увагу, що & у типах параметрів функції каже про те, що це посилання, тобто ви можете їх змінювати.

9

Re: Функції strcat та strcat_s

Yola написав:

Зверніть увагу, що & у типах параметрів функції каже про те, що це посилання, тобто ви можете їх змінювати.

Дякую, я про це знаю))

Подякували: Yola1