2016-12-14 10 views
1

я пытаюсь сделать определенный символ верхнего регистра заданного пользователемпрописных конкретный характер, заданного пользователем в с

, например:

написать фразу:

привет моих зовут Джон

выбрать букву в верхний регистр:

O

Результат после прописные:

Здравствуйте, меня зовут Джон

После моих исследований я видел функцию, называемую ToUpper использованием ctype.h библиотеки. Но я не понимал, как использовать его в моем случае.

пример кода:

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

void uppercase(char *s,char c) 
{ 
    toupper(c); 
} 

int main() 
{ 
    char s[1000]; 
    printf("write a phrase"); 
    fgets(s,1000,stdin); 

    printf("%s\n",s); 
    char c; 
    printf("choose a letter to uppercase"); 
    scanf("%c",&c); 
    printf("%c",c); 
    uppercase(*s,c); 

} 
+0

Вот [человек страница пример использования] (https://msdn.microsoft.com/en-us/library/1t27bw1z. aspx) для 'toupper'. –

+1

В вашем примере, как бы вы нашли все местоположения 'o' или 'O'? Если вы можете найти, где находится символ, вы должны выяснить, как использовать toupper – thurizas

ответ

0

Переход через строку s используя for петли (и strlen()), в контрольной строке, если символ соответствует символу заданного пользователя (if (s[i] == c)) и изменить его uppercase (s[i] = toupper(s[i])

1

Лучше, когда строковые функции возвращают указатель на целевую строку. Таким образом, функция должна быть объявлена ​​как

char * uppercase(char *s, char c); 

Определение функции может выглядеть следующим образом

char * uppercase(char *s, char c) 
{ 
    for (char *p = s; *p != '\0'; ++p) 
    { 
     if (*p == c) *p = toupper((unsigned char)*p); 
    } 

    return s; 
} 

Или, например, функция может быть определена следующим образом

char * uppercase(char *s, char c) 
{ 
    for (char *p = s; (p = strchr(p, c)) != NULL; ++p) 
    { 
     *p = toupper((unsigned char)*p); 
    } 

    return s; 
} 

Другой подход чтобы функция могла изменять несколько символов одновременно. Вот показательной программы

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

char * uppercase(char *s1, const char *s2) 
{ 
    for (size_t i = 0; s1[i += strcspn(s1 + i, s2)] != '\0'; i++) 
    { 
     s1[i] = toupper((unsigned char)s1[i]); 
    } 

    return s1; 
} 

int main(void) 
{ 
    char s[] = "hello my name is John"; 

    puts(s); 
    puts(uppercase(s, "hmn")); 
} 

Выход программы

hello my name is John 
Hello My NaMe is JoHN 
+0

Я работаю на eclipse для ubuntu, поэтому я объявил char * p снаружи от для (char * p = s; * p! = '\ 0'; ++ р) как это символ * в верхнем регистре (символ * с, символ с) { \t символ * р; для (* p = s; * p!= '\ 0'; ++ p) { if (* p == c) * p = toupper ((unsigned char) * p); } возвращение s; } после выполнения функции верхнего регистра, я хочу, чтобы моя основная функция дала мне результат, поэтому я добавил printf после прописных букв (s, c); но я не получил никакого результата? –

+0

@CanOnder Является ли s в основном определяемым как массив или как указатель? –

+0

Как и 'strchr(), strcspn()'. – chux