Я хочу напечатать аббревиатуру слова, но не знаю, что я делаю неправильно

#c #arrays

#c #массивы

Вопрос:

Я хочу напечатать аббревиатуру слова Написать программу на C, которая должна принимать название организации от пользователя в виде строки. Вы должны реализовать следующую функцию для этой строки:
Например:
Word = аббревиатура Pakistan State Oil
: PSO Только заглавные буквы из слова

Он печатает только 1 слово.

Код :

 #include <iostream>
using namespace std;

void printAbbrevation(char Word[], char WordAbb[]);
int findLength(char Word[])
{
    int length = 0;

    for (int i = 0; Word[i] != ''; i  )
    {
        length  ;
    }
    return length;
}

void findAbbrevation(char Word[])
{
    int WordLength = findLength(Word);
    char WordAbb[] = {0};
    
    for (int i = 0; i < WordLength; i  )
    {
        if (Word[i] >= 'A' amp;amp; Word[i] <= 'Z')
        {
            WordAbb[i] = Word[i];
        }
    }
    printAbbrevation(Word, WordAbb);
}

void printAbbrevation(char Word[], char WordAbb[])
{
    int abbword = findLength(WordAbb);
    cout << "Abbrevation of " << Word << " is = ";

    for (int i = 0; i < abbword; i  )
    {
        cout << WordAbb[i];
    }
    
}

int main()
{
    char Word[100] = {0};
    cout << "Enter the Word = ";
    cin.getline(Word,100);
    cout << "Length of Word is = ";
    cout << findLength(Word);
    cout << endl;
    findAbbrevation(Word);
    return 0;
}
 

Вывод, который я получаю :
Вывод

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

1. Несколько вещей. Ваш WordAbb недостаточно длинный для хранения результатов, поэтому у вас неопределенное поведение. Во-вторых, вы устанавливаете i й символ WordAbb, в отличие от правильного первого, второго, третьего и т.д. Вам понадобится второй индекс.

Ответ №1:

Вам нужно изменить свою findAbbrevation() функцию следующим образом:

 void findAbbrevation(char Word[])
{
    int WordLength = findLength(Word);
    char WordAbb[25] = {0};
    int j = 0;
    
    int flag = 0;
    for (int i = 0; i < WordLength; i  )
    {
        // To continue untill we get a space
        // this marks the start of the new word
        if(flag)
        {
            if(Word[i] == ' ')
            {
                flag = 0;
            }
            continue;
        }
        else
        {
            if (Word[i] >= 'A' amp;amp; Word[i] <= 'Z')
            {
                WordAbb[j  ] = Word[i];
                flag = 1;
            }
        }
    }
    printAbbrevation(Word, WordAbb);
}
 

Изменения, которые я внес, следующие:

  • Сохраняйте флаг, когда найдете новое слово, что делается путем проверки наличия пробелов в строке.
  • Для каждого нового найденного слова добавляйте его первый символ в строку сокращения.
  • Сохраните отдельный счетчик для строки сокращения.

Ответ №2:

Поскольку вы используете C and not C , я предлагаю вам использовать string вместо char[] , поскольку может быть проще обрабатывать предложения и выполнять операции с ними таким образом, особенно если вы пришли с языка более высокого уровня, или если вы совсем новичок.

Если вы хотите напечатать первую букву каждого слова в строке, вы можете выполнить итерацию по строке следующим образом:

 void printFirstLetter(string sentence) { 
    int i; 
  
    for (i = 0; i < sentence.length(); i  )  
    { 
        //Print the first letter
        if (i == 0) 
            cout<<sentence[i]; 
  
        // Find the space separating the words, then print the next first letter again.
        if (sentence[i] == ' ')  
        { 
            cout<<sentence[i-1]<<" "<<sentence[i 1]; 
        } 
    } 
} 
 

Например, если у вас есть «Джордж любит кошек», вы получите: G L C .

Поскольку вы используете C и нет C , вы можете использовать string вместо символов. Это может помочь решить некоторые проблемы, если вы новичок в программировании.

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

1. Я бы рекомендовал вводить параметры по постоянной ссылке. Вы также печатаете дополнительные символы и пробелы…

2. Спасибо! Не стесняйтесь улучшать ответ.

Ответ №3:

Вы можете попробовать это, используя современный C .

 #include <iostream>
#include <sstream>
#include <string>

const std::string findAbbrivation(const std::stringamp; sentance){
  std::istringstream ss(sentance);
  std::string word;
  std::string resu<
  while(std::getline(ss, word, ' '))  {
      result  = std::toupper(word[0]);
  }
  return resu<
}


int main(){
    std::cout << findAbbrivation("Pakistan State Oil") << std::endl;
}
 

Идея заключается в том, что вы разбиваете свою строку на пробелы, а затем преобразуете первую букву, а затем объединяете ее в результирующую строку. Вы можете прочитать о getline здесь.