2015-05-16 5 views
2

У меня есть программа для изменения строки и преобразования ее в верхний регистр. Если я пишу helloworld!, выход должен быть !DLROWOLLEH. Но если я напишу hello world!, то выход будет !DLRO. Не могли бы вы рассказать мне, где может возникнуть проблема?Преобразование строчных букв в верхний регистр

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

char * reverse(const char * text) 
{ 

if (text==NULL) 
return NULL; 

int length = strlen(text); 
char * reversed_string = malloc(length+1); 

for(int i = 0; i < length/2; ++i) 
    { 
     reversed_string[i] = text[(length-1) - i]; 
     reversed_string[(length-1) - i] = text[i]; 
    } 

reversed_string[length] = '\0'; 

//upper(reversed_string); 

return reversed_string; 
} 




void upper(char *str1)           
{ 
    while(*str1!='\0')             
     { 
      if(*str1>96&&*str1<123)       
       *str1=*str1-32;          
     str1++;               
     } 
} 

int main(int argc, char * argv[]) 
{ 
    char p[256]; 
    fgets(p, sizeof(p), stdin); 

    char * rev_str = reverse(p); 
    upper(rev_str); 
    printf("%s\n", rev_str); 

    rev_str = 0; 
    return 0; 
} 
+1

Вы действительно определяете 'upper()' __inside__ 'reverse()' ??? –

+2

@SouravGhosh Это расширение gcc, и, следовательно, это, вероятно, правильный код, это плохая идея, и на самом деле это разрешено или поощрено некоторыми языками программирования, я не вижу прецедента, но я боюсь от программистов, которые его узнали. Очевидная причина для этого заключается в том, что переменные, локальные по отношению к внешней функции, видны во внутренней, это не так, как вы не можете передавать их в качестве параметров и делать с ними все, что вам нравится, поэтому использование этого метода означает, что есть проблема в понимании структурированного программирования, в то время как это очень сложная ** структура **. –

+0

Да, это большая проблема? – JEl

ответ

3

Проблема здесь

for(int i = 0; i < length/2; ++i) 

Это length является нечетным числом (например, 11 в вашем примере), это будет неявно округлять вниз, и, как следствие, вы никогда не писать средний элемент в строке. В вашем случае это было 0, но это не гарантировано, поэтому любой персонаж мог появиться там, вместо того, чтобы разорвать строку раньше.

Самое простое исправление будет изменено на (length+1)/2, но это приведет к тому, что вы будете писать средний элемент дважды.

На самом деле, я думаю, что это намного проще, если вы просто перевернули строку, просто перебирая ее в одном направлении, а не в обоих направлениях.

+0

Спасибо, ваше решение «(длина + 1)/2» работает. Еще раз спасибо! – JEl

1

Я изменил ваш код и работает так, как ожидалось.

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

char * reverse(const char * text) 
{ 

    if (text==NULL) 
     return NULL; 

    unsigned long length = strlen(text); 
    char * reversed_string = malloc(length+1); 

    for(int i = 0; i < length; ++i) 
    { 
     reversed_string[i] = text[(length-1) - i]; 
     //reversed_string[(length-1) - i] = text[i]; 
    } 

    reversed_string[length] = '\0'; 

    //upper(reversed_string); 

    return reversed_string; 
} 




void upper(char *str1) 
{ 
    while(*str1!='\0') 
    { 
     if(*str1>96&&*str1<123) 
      *str1=*str1-32; 
     str1++; 
    } 
} 

int main(int argc, char * argv[]) 
{ 

    char p[256]; 
    fgets(p, sizeof(p), stdin); 

    char * rev_str = reverse(p); 
    printf("%s\n", rev_str); 
    upper(rev_str); 
    printf("%s\n", rev_str); 

    rev_str = 0; 

    return 0; 
} 
Смежные вопросы