2017-02-18 5 views
-2

Мне нужно создать программу, которая заглавная буква каждого слова в строке. Например, если строковый аргумент «привет». Меня зовут Джо. как ваше имя? »функция должна манипулировать строкой, поэтому она содержит« Привет. Меня зовут Джо. Как тебя зовут? »Я не уверен, что я делаю неправильно. Какие-либо предложения? Вот мой код:Занимая первое слово в каждом предложении

#include<iostream> 
#include<cctype> 
#include<cstdlib> 

using namespace std; 

void capitalize(char sentence[], int const SIZE); 

int main() 
{ 
    const int SIZE = 1024; 
    char sentence[SIZE]; 

    cout << "Enter a string: " << endl << endl; 
    cin.getline(sentence, SIZE); 

    capitalize(sentence, SIZE); 

    system("pause"); 
    return(0); 
} 

void capitalize(char sentence[], int SIZE) 
{ 

    char *strPtr; 
    int count = 0; 

    sentence[0] = toupper(sentence[0]); 

    for (int i = 0; i < SIZE; i++) 
    { 
     strPtr = strstr(sentence[i], "."); 

     if (*strPtr == '.') 
     { 
        *strPtr = toupper(*strPtr); 
     } 
    } 

    while (sentence[count] != '\0') 
    { 
      cout << sentence[count]; 
      count++; 
    } 
} 
+1

Каков вывод вашего кода? – Fallen

+0

@Fallen Я получаю сообщение об ошибке, говорящее, что 'strstr' не было объявлено в этой области. – PAXlater

+1

Некоторые советы: 1) Решите, пишете ли вы C или C++. 2) Цикл до тех пор, пока вы не достигнете РАЗМЕРЫ, скорее всего, пройдет мимо конца ввода пользователем. –

ответ

0

Во-первых, как уже упоминалось в комментариях, вы не включая cstring. Во-вторых, вы вызываете strstr на sentence[i], что является символом. Вы хотите sentence + i, который является символом char *. Это исправит ваши синтаксические ошибки.

Для логической ошибки, похоже, вы пытаетесь использовать период toupper.

strPtr = strstr(sentence[i], "."); должен найти первый период в строке, начиная с i (включительно). Затем вы проверяете, есть ли strstr что-либо (если бы он не возвращал значение null.Если найдена последовательность, то вы задерживаете strPtr, но strPtr все еще указывает на первый символ целевой строки, то есть '.'. Вы должны искать целевую строку ". " затем увеличивая одно прошлое, чтобы найти первую букву следующего предложения. К сожалению, нет безопасного способа сделать это с помощью strstr, так как он не говорит вам, как далеко в строку, которую он смотрел, поэтому возможно, что строка просто заканчивается ". " и одно прошлое, которое выпадает из массива. Вам понадобится выполнить итерацию по массиву вручную, ища '.', а затем проверять его или использовать только std::find.

1
#include <cstring> // need this for strstr() 

void capitalize(char sentence[], int SIZE) 
{ 

    char *strPtr; 
    int count = 0; 

    sentence[0] = toupper(sentence[0]); 

    for (int i = 0; i < SIZE; i++) 
    { 
     strPtr = strstr(&sentence[i], "."); 
     //strPtr returns the pointer to 
     //the first occurence of "." after sentence[i] 
     if(strPtr==NULL) break; 
     if (*strPtr == '.') 
     { 
      // you really dont want to do this 
      //*strPtr = toupper(*strPtr); 
      // put the suitable code here and everything will work 
     } 
    } 
    //why the while loop? and count? 
    while (sentence[count] != '\0') 
    { 
      cout << sentence[count]; 
      count++; 
    } 
} 

Что вы делали, так это использовать «.», Но, очевидно, вы хотите, чтобы следующий символ был заглавным. Поэтому напишите эту часть кода самостоятельно, так как вы найдете ее более полезной.

Смежные вопросы