Создайте новую строку, которая содержит только буквенно-цифровые символы из старой строки - PullRequest
1 голос
/ 04 января 2012

Используя только библиотеки stdio.h, string.h и stdlib.h, как мне реализовать это?

Я новичок в программировании, поэтому, пожалуйста, потерпите меня!

Ответы [ 4 ]

3 голосов
/ 04 января 2012
  1. Выделите новый массив char той же длины, что и ваша строка.Убедите себя, что для этого достаточно места.Не забывайте NUL.
  2. Цикл по строке, копирование в новую строку только тех буквенно-цифровых символов.Вы не можете сделать это мобильно без включения <ctype.h> и использования функции / макроса из этого заголовка, если только вы не собираетесь перечислять все символы, которые считаете буквенно-цифровыми.NUL.
1 голос
/ 04 января 2012

Каждый символ, который вы читаете в своей строке, является байтом (вы можете считать его числом от 0 до 255, и именно так компьютеры их обрабатывают), поэтому вам просто нужно проверить таблицу ascii, чтобы увидеть, к какой букве относится данная буква.

Каждый буквенно-цифровой символ находится в этом диапазоне: [48, 58] (для чисел), или [65, 90] (в верхнем регистре), или [97, 122] (в нижнем регистре).

Посмотрите на это:

#include <stdio.h>
#include <stdlib.h>

#define SIZE    64

int isalphanum(char);    /*states if a char is alphanumerical or not*/
char *getalphanum(char *, char*);    /*modifies the second string to get the result*/

int main(void) {
    char in[SIZE] = "Hello, W@#@#@#@#@#orl...,.,d!";    /*just a random to try out*/
    char out[SIZE];
    getalphanum(in, out);
    printf("%s", out);
    return 0;
}

int isalphanum(char a) {
    if ((a >= 48) && (a <= 58))
        return 1;
    if ((a >= 65) && (a <= 90))
        return 1;
    if ((a >= 97) && (a <= 122))
        return 1;
    return 0;
}

char *getalphanum(char *s, char *t) {
    if ((s == NULL) || (t == NULL))    /*tests if the strings are "handble"*/
        return NULL;
    int i = 0;
    int j = 0;
    char c;
    while ((c = *(s + i)) != '\0') {
    if (isalphanum(c)){
        *(t + j) = c;
        j++;
    }  
    i++;
    }
    *(t + j) = '\0';
    return t;
}

Этот код работает и очень прост и может быть улучшен, но есть все, что вам нужно.

1 голос
/ 04 января 2012

Поскольку это домашнее задание, вот словесное описание:

Запустите цикл над исходной строкой и используйте функции isalnum(), чтобы определить, является ли символ буквенно-цифровым.Сохраняйте секунду char array разумного размера, и каждый раз, когда вы сталкиваетесь с AlphaNum, вставляйте его в этот массив.Как только все символы AlphaNum будут скопированы во второй массив, NULL завершит его, и вы получите строку.

Примечание: isalnum() определено в ctype.h, так что если вы неЕсли вы можете использовать это, вам, возможно, придется определить эту функцию для себя.Это еще одно собственное упражнение.

0 голосов
/ 04 января 2012

Лучший способ - использовать isalnum() из ctype.h, но теперь это не вариант, я написал нестандартную / непереносимую функцию под названием isalnum_not_prefered(), которая эквивалентна ctype.h ' с isalnum().

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

int isalnum_not_prefered(char s) 
{
    if((s >= 'A' && s <= 'Z') || 
       (s >= 'a' && s <= 'z') || 
       (s >= '0' && s <= '9')) 
        return 1;
    return 0;
}

int main(void)
{
    char str[] = "this!234$#&@#$^is5@#$a#@$4677~=_?}valid2234kjstring";
    int len = strlen(str);
    int i, j=0;

    char *newstr1 = NULL;
    char *newstr2 = NULL;

    if ((newstr1 = (char *) malloc(sizeof(char) * len + 1)) == NULL) {
        printf("unable to allocate memory \n");
        return -1;
    }

    for (i=0 ; i<len ; i++) {
        if (isalnum(str[i])) {
            newstr1[j] = str[i];
            j++;
        }
    }
    newstr1[j] = '\0';

    if ((newstr2 = (char *) malloc(sizeof(char) * len + 1)) == NULL) {
        printf("unable to allocate memory \n");
        return -1;
    }

    j=0;
    for (i=0 ; i<len ; i++) {
        if (isalnum_not_prefered(str[i])) {
            newstr2[j] = str[i];
            j++;
        }
    }
    newstr2[j] = '\0';

    printf("string  : %s \n", str);
    printf("result1 : %s \n", newstr1);
    printf("result2 : %s \n", newstr2);

    free(newstr1);
    free(newstr2);

    return 0;
}

Очки на заметку:

  1. строк в C оканчивается на \0. Таким образом, новая строка, которую вы заполняете, также должна заканчиваться на \0
  2. malloc() 'ed память должна быть free()' ed
  3. malloc() ошибки должны быть обработаны
  4. этот код не является переносимым, так как предполагает, что набор символов машины равен ASCII. Если оборудование поддерживает какой-либо другой набор символов (скажем, EBCDIC), то это может работать не так, как ожидалось.

Надеюсь, это поможет!

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