2011-02-07 2 views
2

Мне нужна эффективная реализация функции в C, которой будет присвоен символ [], и он удалит из него все символы верхнего регистра, возвращая все остальное. , например. если дан HELLOmy_MANname_HOWis_AREjohn_YOU__Функция C для удаления всех прописных символов

он должен вернуть my_name_is_john__

это не HW слишком легко быть один, но 2 утро в моем часовом поясе, и я думаю, что это было бы решением проблемы, им лицо в моем коде сейчас

любая помощь приветствуется! cheers! =)

+1

Что вы пробовали до сих пор и почему он не работает для вас? – zebrabox

+2

Эффективно или эффективно с точки зрения времени? – frm

+0

@frm: time-effecient –

ответ

10

Возможно, это?

i = j = 0; 
while (s[i] != '\0') { 
     if (!isupper(s[i]) 
       t[j++] = s[i]; 
     i++; 
} 
t[j] = '\0'; 
+0

BTW, если вы не хотите иметь отдельную переменную 't' для результатов, тогда просто замените ее на' s' и не забудьте сделать это: 's [j] = '\ 0';' – Peyman

+2

Вам нужно do 't [j] = '\ 0';' после цикла в любом случае (так как вы не вводите тело цикла в NUL). –

+0

Правда; исправлено, спасибо. – Peyman

4

Как насчет алгоритм какой-нибудь псевдокод?

initialize a rewrite pointer to the beginning of the string 
for each character in the input string that isn't nul: 
    if character is not an uppercase letter: 
     add the character to rewrite pointer 
     increment rewrite pointer 
add nul terminator to rewrite pointer 
2

Как насчет этого?

#include <string.h> //strlen, strcpy 
#include <ctype.h> //isupper 
#include <stdlib.h> //calloc, free 

//removes uppercase characters 
void rem_uc(char *str) { 
    char *newStr = calloc(strlen(str), sizeof(char)); 
    char curChar; 
    int i_str = 0, i_newStr = 0; 
    do { 
     curChar = str[i_str]; 
     if(!isupper(curChar)) { 
      newStr[i_newStr] = curChar; 
      i_newStr++; 
     } 
     i_str++; 
    } while(curChar != 0); 
    strcpy(str, newStr); 
    free(newStr); 
} 
1

Работы на месте:

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

char* removeUpperCase(char *s) { 
    char *current = s; 
    char *r = s; // r is the same rewrite pointer someone else mentioned in his answer =) 
    do { 
     if ((*current < 'A') || (*current > 'Z')) { 
      *r++ = *current; 
     } 
    } while (*current++ != 0); 
    return s; 
} 

int main() { 
    char *s = strdup("HELLOmy_MANname_HOWis_AREjohn_YOU__"); // needed because constants cannot be modified 
    printf(removeUpperCase(s)); 
    free(s); 
    return 0; 
} 
Смежные вопросы