Игнорирование не строчных букв в C - PullRequest
1 голос
/ 20 мая 2019

Мне необходимо написать код, который читает строку и помещает буквы в строке, которые меньше 'm', в массив с именем first, а буквы с номером 'm' или больше помещаются в массив с именемпрошлой.Когда он встречает строчную букву, он должен просто пропустить ее и перейти к следующей.

Мой код здесь работает только в том случае, если в строке присутствуют буквы не нижнего регистра, но не работает, когда в нем присутствуют цифры и символы.

#include<stdio.h>

// main function
int main(void){
  // declare strings
  char letters[20], first[20], last[20];

  // read in a lower-case string
  printf("enter letters: ");
  scanf("%19s",letters);  //the number %19s limits the string to being
                          //19 characters long (plus the null character)

  // setup indexes to track current index of  arrays. 
  int letters_index, first_index, last_index;
  letters_index=0;
  first_index=0;
  last_index=0;
char curr_letter ;

  // loop and split
while(letters[letters_index] != 0) { // not null
    switch (letters[letters_index]){
        case 97 ... 122:
    curr_letter = letters[letters_index];
    // less than 'm'?
    if(curr_letter < 'm'){
      // add to first
      first[first_index]=curr_letter;
      first_index++;
    } else {
      // otherwise, add to last
      last[last_index]=curr_letter;
      last_index++;
    }
    letters_index++;
            break;
    }
}


  // now add nulls
  first[first_index]='\0';
  last[last_index]='\0';

  // print arrays
  printf("first: %s\n",first);
  printf("last: %s\n",last);
}

Если вводом является hell2o, выводдолжен быть первым: ад;последний: о

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Ваш код увеличивает letters_index, только если ввод соответствует case 97 ... 122:.Это бесконечный цикл, если найден несоответствующий символ.

Переместить увеличивающийся letters_index++; из switch{} в конец цикла while.

Не относится кошибка: вместо чисел 97 и 122 следует использовать соответствующие символьные константы 'a' и 'z' или, возможно, библиотечную функцию islower().

Модифицированный код:

#include <stdio.h>

// main function
int main(void){
    // declare strings
    char letters[20], first[20], last[20];

    // read in a lower-case string
    printf("enter letters: ");
    scanf("%19s",letters);  //the number %19s limits the string to being
    //19 characters long (plus the null character)

    // setup indexes to track current index of  arrays. 
    int letters_index, first_index, last_index;
    letters_index=0;
    first_index=0;
    last_index=0;
    char curr_letter ;

    // loop and split
    while(letters[letters_index] != 0) { // not null
        switch (letters[letters_index]){
        case 'a' ... 'z':
        curr_letter = letters[letters_index];
        // less than 'm'?
        if(curr_letter < 'm'){
            // add to first
            first[first_index]=curr_letter;
            first_index++;
        } else {
            // otherwise, add to last
            last[last_index]=curr_letter;
            last_index++;
        }
        break;
        }
        letters_index++;
    }


    // now add nulls
    first[first_index]='\0';
    last[last_index]='\0';

    // print arrays
    printf("first: %s\n",first);
    printf("last: %s\n",last);
}
1 голос
/ 20 мая 2019

Вы увеличиваете счетчик только тогда, когда символ находится между 'a' и 'z', в результате чего вы попадаете в бесконечный цикл, перемещаете счетчик за пределы switch:

while(letters[letters_index] != 0) { // not null
    switch (letters[letters_index]){
        case 97 ... 122:
            curr_letter = letters[letters_index];
            // less than 'm'?
            if(curr_letter < 'm'){
              // add to first
              first[first_index]=curr_letter;
              first_index++;
            } else {
              // otherwise, add to last
              last[last_index]=curr_letter;
              last_index++;
            }
            // letters_index++; --> Not here
            break;
    }
    letters_index++; // --> Here
}

С другой стороны, не используйте магические числа, такие как 97 и 122, вместо этого:

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