2014-11-14 2 views
0

Я только начали изучать C. Делаю программу ниже:символов Обработки и Манипуляция строк

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

int main() 
{ 
    char s1[1000]; 
    char s2 [1000]; 
/* void countchar (const char * const); */ 
    void reverse(const char * const); 
    char manipulate (char , const char); 

    printf ("Enter sentence number 1:\n"); 
gets (s1); 
printf ("\nEnter sentence number 2:\n"); 
gets (s2); 

printf ("\nThe two sentences entered are:\n1. %s\n2. %s\n\n", s1, s2); 

/* printf ("_______________________________________\n\n"); 
countchar (s1, s2);  */ 

printf ("_______________________________________\n\n" 
     "The first sentence reversed is:\n"); 
reverse (s1); 
printf ("\n________________________________________\n"); 

manipulate (s1, s2); 

return 0; 
} 

void reverse (const char * const s1Ptr) 
{ 
    if (s1Ptr [0] == '\0') 
     return; 
    else /*{ 
      if (isupper (s1Ptr [0])) 
       tolower (s1Ptr [0]); 
        else toupper (s1Ptr [0]); 
*/ 
    reverse (&s1Ptr[1]); 
    putchar (toupper (s1Ptr [0])); 
} 


char manipulate(char s1, const char s2) 
{ 
printf ("10 characters of first sentence + 10 characters of second sentence:\n%s", strncat (s1, s2, 10)); 
} 

Программа будет читать два предложения, то подсчитать количество символов, реверса первого предложения и преобразуйте все строчные в верхние регистры наоборот, и добавьте 10 символов из второго абзаца в первый.

Функция, манипулирующая добавлением символов, не работает. Вы можете исправить это для меня? В функции reverse, как мне преобразовать регистр наоборот? Потому что я могу получить его только от нижнего регистра до верхнего регистра

Часть с/* связана с тем, что я не знаю, как сделать эту функцию. Мне действительно нужна помощь в этом, пожалуйста, любезно укажите мои ошибки и помогите мне исправить их. Спасибо.

+0

его подпись неверна. Он должен принимать 'char *', а не один символ 'char'. –

+1

'void reverse (const char * const s1Ptr)' не должен быть аргументом 'const', потому что функция изменяет' * s1Ptr' (хотя и закомментирован). Эта функция также рекурсивна, это то, что вы намеревались? Примечание. Существуют библиотечные функции 'strupr()' и 'strlwr()', которые работают с массивом char (строка). Зачем изобретать колесо? –

+1

'char манипулировать (char, const char);' -> char манипулировать (char *, const char *); и '#include " – BLUEPIXY

ответ

0

Я добавил комментарии к коду вы публикуемые:

void reverse (const char * const s1Ptr) // don't define as const 
{ 
    if (s1Ptr [0] == '\0')    // testing agaist 0 will do 
     return; 
    else /*{ 
     if (isupper (s1Ptr [0])) 
      tolower (s1Ptr [0]);   // nothing done with the result 
     else toupper (s1Ptr [0]);  // nothing done with the result 
*/ 
    reverse (&s1Ptr[1]);     // recursion? A simple loop would do 
    putchar (toupper (s1Ptr [0]));  // OP: "Function will only uppercase it" 
} 

переписал этот код, используя простой способ, указывающий на символ. Вам все равно нужно отменить одну из двух строк, но я оставлю это вам, чтобы понять.

void reverse (char * s1Ptr)    // don't define as const 
{ 
    if (*s1Ptr == 0)      // terminate recursion 
     return; 
    else { 
     if (isupper (*s1Ptr))   // simpler way of writing s1Ptr[0] 
      *s1Ptr = tolower (*s1Ptr); // put result back in the string 
     else *s1Ptr = toupper (*s1Ptr); // because you manipulate it later 
    } 
    putchar (*s1Ptr);     // swapped last two lines round 
    reverse (s1Ptr+1);     // simpler way of pointing to next character 
} 

«Функция, манипулирующая добавлением символов, не работает». Да!

Смежные вопросы