2013-03-26 5 views
2

Я новичок в C и программировании. Я застрял в выполнении домашних заданий. Мой вывод показывает только первый символ в верхнем регистре и следующие символы в некоторых странных числах. Может кто-нибудь взглянуть на мой код и дать мне несколько советов о том, что я сделал неправильно, и о том, как исправить эту проблему? Ваша помощь очень ценится!Указатель и массив в C

«Напишите функцию void sticky (char * word), где слово - это одно слово, например« липкое »или« СЛУЧАЙНОЕ ». Sticky() должно изменить слово, чтобы оно появилось с« липкими колпачками »(http://en.wikipedia.org/wiki/StudlyCaps), что Буквы должны быть в чередующихся случаях (верхнем и нижнем), начиная с верхнего регистра для первой буквы. Например, «липкий» становится «StIcKy», а «RANDOM» становится «RaNdOm». Следите за концом строка, обозначаемая «\ 0». Вы можете предположить, что лексические строки передаются функции sticky() ».

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

/*converts ch to upper case, assuming it is in lower case currently*/ 
char toUpperCase(char ch) 
{ 
return ch-'a'+'A'; 
} 

/*converts ch to lower case, assuming it is in upper case currently*/ 
char toLowerCase(char ch) 
{ 
return ch-'A'+'a'; 
} 

void sticky(char* word){ 
/*Convert to sticky caps*/ 

for (int i = 0; i < sizeof(word); i++) 
{ 
    if (i % 2 == 0) 
    { 
     word[i] = toUpperCase(word[i]); 
    } 
    else 
    { 
     word[i] = toLowerCase(word[i]); 
    } 
} 

}

int main(){ 
/*Read word from the keyboard using scanf*/ 
char word[256]; 
char *input; 
input = word; 
printf("Please enter a word:\n"); 
scanf("%s", input); 

/*Call sticky*/ 
sticky(input); 

/*Print the new word*/ 
printf("%s", input); 

for (int i = 0; i < sizeof(input); i++) 
{ 
    if (input[i] == '\n') 
    { 
     input[i] = '\0'; 
     break; 
    } 
} 

return 0; 

}

+0

'/ * преобразует ч в нижний регистр, при условии, что в верхнем регистре в настоящее время * /' и наоборот, это большой ключ. – SGM1

+0

Слияние ответа Кита и ритеша кажется лучше – SGM1

ответ

0

Функция sizeof() используется для вычисления размера типа данных, а не размер выделяется указателем.

Поэтому вы не можете использовать его как sizeof(word). Вместо этого перебирайте символы, пока не наткнетесь на \0, что указывает на конец строки.

На примере:

int i = 0; 
while (word[i] != 0) { 
    // do lower/upper case conversion. 
} 
0

sizeof (word) является размер полукокса *, вы должны передать другой параметр с размером массива ... или использовать STRLEN().

5

вам нужно использовать strlensizeof не найти длину строки символ *

2

Вы должны использовать strlen вместо sizeof. Кроме того, вы должны проверить, является ли ваше письмо уже в верхнем или нижнем регистре:

for (int i = 0; i < strlen(word); i++) 
{ 
    if (i % 2 == 0) 
    { 
     if (isLowerCase(word[i])) 
     { 
      word[i] = toUpperCase(word[i]); 
     } 
     else 
     { 
      // do nothing. 
     } 
    } 
    else 
    { 
     if (isUpperCase(word[i])) 
     { 
      word[i] = toLowerCase(word[i]); 
     } 
     else 
     { 
      // do nothing. 
     } 
    } 
} 

Обратите внимание, что я не выполнил функции isUpperCase и isLowerCase; D

0

Что-то в вашем коде: вы делая нечетные символы верхним регистром и даже нижними, но вы не проверяете, были ли они в нижнем или верхнем регистре в первую очередь. Но опускание уже строчной буквы дает неверное значение (то же самое верно и для «продержания» уже заглавной буквы).

Так что вы должны сделать:

char toUpperCase(char ch) 
{ 
if ((ch >= 'a') && (ch <= 'z')) { 
    return ch-'a'+'A'; 
} else { 
    return ch; 
} 
} 

и то же самое для toLowerCase.

3

Изменить ваш change upper и change lower функция

/*converts ch to upper case,*/ 
char toUpperCase(char ch) 
{ 
    if(ch>='a' && ch<='z')/*If condition just to make sure current letter is in lower case*/ 
     return ch-'a'+'A'; 
} 

/*converts ch to lower case, assuming it is in upper case currently*/ 
char toLowerCase(char ch) 
{ 
    if(ch>='A' && ch<='Z')/*If condition just to make sure current letter is in Upper case*/ 
     return ch-'A'+'a'; 
} 

Кроме того, только four characters преобразуются так как вы используете sizeof для нахождения длины строки. sizeof всегда возвращает 4 (зависит от машины). use strlen(word) найти длину строки слова в следующем цикл:

for (int i = 0; i < strlen(word); i++) 
{ 
} 
0

Большое вам спасибо за советы! Используя ваши предложения, я изменил свой код, и теперь он работает.

Ниже мой пересмотренный код:

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

/*converts ch to upper case, assuming it is in lower case currently*/ 
char toUpperCase(char ch){ 
    return ch-'a'+'A'; 
} 

/*converts ch to lower case, assuming it is in upper case currently*/ 
char toLowerCase(char ch){ 
    return ch-'A'+'a'; 
} 



void sticky(char* word) 
{ 
/*Convert to sticky caps*/ 

for (int i = 0; i < strlen(word); i++) 
{ 
    if (i % 2 == 0) 
    { 
     if (word[i] >= 'a' && word[i] <= 'z') 
     { 
      word[i] = toUpperCase(word[i]); 
     } 

    } 
    else 
    { 
     if (word[i] >= 'A' && word[i] <= 'Z') 
     { 
      word[i] = toLowerCase(word[i]); 
     } 

    } 
} 

}

int main(){ 
/*Read word from the keyboard using scanf*/ 
char word[256]; 
char *input; 
input = word; 
printf("Please enter a word:\n"); 
scanf("%s", input); 

/*Call sticky*/ 
sticky(input); 

/*Print the new word*/ 
printf("%s", input); 

for (int i = 0; i < sizeof(input); i++) 
{ 
    if (input[i] == '\n') 
    { 
     input[i] = '\0'; 
     break; 
    } 
} 

return 0; 

}

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