Преобразование маленькой буквы в заглавную - PullRequest
3 голосов
/ 31 марта 2011

Я пытаюсь преобразовать строку из маленькой буквы в заглавную.Я получил какую-то ошибку (изменение доступа), что бы я сделал?

int main()
{
    char str[10];
    int i=0;
    scanf("%s", &str);
    while (str[i] !=0)
    {
        str[i] += -32;
        printf("%s", str[i]);
    }
    return 0;
}

thx

Ответы [ 7 ]

5 голосов
/ 31 марта 2011
  1. Если вы введете строку длиной более 9 символов, scanf() попытается записать после конца вашего строкового буфера.

  2. Ваш цикл whileникогда не завершается, поскольку вы никогда не меняете i.

  3. Вы должны использовать "%c" в качестве строки форматирования при вызове printf(), поскольку вы пишете символы, а не строки с нулевым символом в конце.

2 голосов
/ 31 марта 2011

Как сказал cprogrammer

Вам лучше использовать toupper

/* toupper example */
#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
  {
    c=str[i];
    putchar (toupper(c));
    i++;
  }
  return 0;
}

Но если нет, то вы хотите сделать это по-своему

int main()
{
    char str[10];
    int i=0;
    scanf("%s", &str);
    while (str[i]!='\0' && i<10)  
    {// You forgot this: '\0' instead of 0 and also i<10
        str[i] += -32;
        printf("%c", str[i]);//char, not string
        i++; //And this
    }
    return 0;
}
2 голосов
/ 31 марта 2011
int main()
{
    char str[10];
    int i=0;
    scanf("%s", str);
    while (str[i] != 0)
    {
        str[i] += -32;
            i++;
    }
    printf("%s", str);
    return 0;
}

и, конечно, вы должны проверить переполнение строки ...

1 голос
/ 27 мая 2016

Вы можете использовать оператор Побитовое И (&), чтобы сделать заглавную букву заглавной.

char ch = letter & 223; [letter = a-z] // Now ch is all time capital letter
1 голос
/ 31 марта 2011

Здесь есть несколько ошибок:

  1. scanf("%s", &str); - поскольку str является указателем на символ, вам не нужно указывать его адрес, но scanf("%s", str);. (и как сказал Свен, это небезопасно)
  2. while (str[i] !=0) это бесконечный цикл, вы должны увеличивать i в конце блока while.
  3. str[i] += -32; изменит любой символ, на котором вы находитесь, вы должны в любой момент проверить, является ли он строчными, например:

    if (str [i]> = 'a' && str [i] <= 'z') { str [i] - = 32; } // по какой-то причине не удалось отформатировать эту строку .... </p>

  4. printf("%s", str[i]) - снова неправильный способ использования printf, поскольку %s ожидает char*, а str[i] - char. вместо этого используйте printf("%c", str[i]), который ожидает символ

0 голосов
/ 25 июля 2012
#include<stdio.h>
#include<conio.h>
#include<string.h>

void main();
{
    int i, count;
    char str[200];
    clrscr();
    printf("Enter a string");
    scanf("%s", str);
    count = strlen(str);
    for(i=0; i<=count; i++)
    {
        if((str[i] >= 97) && (str[i] <= 122))
        {
            str[i] = str[i] - 32;
        }
    }
    printf("%s", str);
    getch();
}
0 голосов
/ 31 марта 2011

Вам лучше использовать toupper

/* toupper example */
#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
  {
    c=str[i];
    putchar (toupper(c));
    i++;
  }
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...