Массив не хранит за пределами первого пробела - PullRequest
0 голосов
/ 05 мая 2018

ввод, предоставленный через temp, является предложением, и мне нужно удалить пробелы и специальные символы, но 'mes' хранит только первое слово

#include <iostream>
#include <cmath>
using namespace std;
int main(){
char mes[51];
char pas[11];
char tem[51];
cin.getline(tem,51);
cin.getline(pas,11);
for(int i=0;i<51;i++){
    mes[i]='\0';
}
for(int t=0;t<sizeof(pas);t++){
    pas[t]=tolower(pas[t]);
}
for (int i=0;i<50;i++){
    char c=tem[i];
    int ch=(int)c;
    if(( ch >= 65 && ch <= 90) || ( ch >= 97 && ch <= 122)){
        if( ch >= 65 && ch <= 90)
            ch+=32;
        mes[i]=(char)ch;
    }
    else
        continue;
}
cout<<mes<<endl;

1 Ответ

0 голосов
/ 05 мая 2018

Обратите внимание, что вы устанавливаете каждый индекс в mes на '\0', или NUL. Когда вы просматриваете tem, проверяя, является ли каждый символ буквой, вы случайно отделяете слова на \0 внутри mes. Вам нужно иметь отдельный указатель, который позволит вам добавлять буквы, когда вы их найдете.

Ваш for цикл может выглядеть следующим образом.

int currentIndex = 0;
for (int i = 0; i < 50; i++){
    char c = tem[i];
    int ch = (int)c;
    if(( ch >= 65 && ch <= 90) || ( ch >= 97 && ch <= 122)){
        if( ch >= 65 && ch <= 90)
            ch+=32;
        mes[currentIndex++]=(char)ch;
    }
    else
        continue;
}

Таким образом, вы будете добавлять письмо сразу после следующего, а не что-то вроде Hello\0World.

Также помните, что cout будет печатать только строки, пока не найдет символ \0. Технически вы храните все буквы, которые вы найдете в предложении, но они разделены \0, и поэтому cout печатает только первое слово.

...