Код выводит случайные символы, я не уверен, что не так - PullRequest
3 голосов
/ 02 ноября 2019

Я создал программу, которая сокращает полные имена до инициалов и удаляет все пробелы между тем, что было введено. Он работал раньше, но теперь он печатает инициалы, но также случайные символы? Я не могу понять, почему он это делает. Я также новичок в программировании.

Это мой код:

 // This code removes the spaces from the inputted name 

char *removeSpaces(char *str) 
{ 
    int i = 0, j = 0; 
    while (str[i]) 
    { 
        if (str[i] != ' ') 
           str[j++] = str[i]; 
        i++; 
    } 
    str[j] = '\0'; 
    return str; 
} 

// This code takes the users name, and shortens (sh) it

int main(void) {

    char str[100],sh[20];
    int j=0;

    cout<<"Enter Full Name :";
    cin.getline(str,30);

    for(int i=0;i<strlen(str);i++)
      {
       if(i==0){
         sh[j]=str[i];
         sh[++j]=' ';
        }

       else if(str[i]==' '){
         sh[++j]=str[i+1];
         sh[++j]=' ';
        }
       }

// This then takes the remove spaces code, and prints the initials with a new line

    cout << removeSpaces(sh) <<endl;
    cout << "\n" <<endl;

   return 0;
}

Изображение вывода

Ответы [ 3 ]

1 голос
/ 02 ноября 2019

Вы пропустили строку (я думаю) после цикла for в вашей функции main, что означает, что ваша строка потенциально не заканчивается нулем.

Использование той же (правильной) логикиу вас есть функция removeSpaces, просто добавьте эту строку сразу после цикла for в main:

sh[++j] = '\0';
1 голос
/ 02 ноября 2019

Вам не хватает добавления символа конца строки ('\ 0') в строку sh. Ниже приведена программа.

#include <stdio.h>

char *removeSpaces(char *str) 
{ 
    int i = 0, j = 0; 
    while (str[i]) 
    { 
        if (str[i] != ' ') 
           str[j++] = str[i]; 
        i++; 
    } 
    str[j] = '\0'; 
    return str; 
} 

// This code takes the users name, and shortens (sh) it

int main(void) {

    char str[100],sh[100];
    int j=0;

    cout<<"Enter Full Name :";
    cin.getline(str,30);

    for(int i=0;i<strlen(str);i++)
      {
       if(i==0){
         sh[j]=str[i];
         sh[++j]=' ';
        }

       else if(str[i]==' '){
         sh[++j]=str[i+1];
         sh[++j]=' ';
        }
       }

       sh[j+1] = '\0';

// This then takes the remove spaces code, and prints the initials with a new line

    cout << removeSpaces(sh) <<endl;
    cout << "\n" <<endl;

   return 0;
}

Введите полное имя: ra me ge rmg

0 голосов
/ 02 ноября 2019

Вы не завершаете sh с \0 после того, как закончите, но removeSpaces() ожидает нулевой символ в конце строки. Из-за этого removeSpaces() может пройти за предполагаемую границу.

Просто добавьте эту строку после for в main():

sh[++j] = '\0\;

Wordпредупреждение: Перед установкой всегда проверяйте, что j <20 (размер <code>sh). В противном случае вы могли бы пройти границу sh. Это также может стать источником проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...