Функция C для использования заглавной буквы в словах в массиве

Я новичок в C и наткнулся на стену при создании функции ниже. Я хочу использовать эту функцию, чтобы сделать первую букву слова в верхнем регистре для статического массива символов (char string []. На мой взгляд, это нормально, но я получаю некоторые синтаксические ошибки, которые, вероятно, довольно простые. Ошибки компилятора :

ошибка: недопустимое преобразование из const char' toconst char * 'инициализирующий аргумент 1 из `size_t strlen (const char *)' присвоение местоположения только для чтения

  void Cap(char string[]){
    int i;
    int x = strlen(string);
    for (i=1;i<x;i++){
         if (isalpha(string[i]) && string[i-1] == ' '){
         // only first letters of a word.
             string[i]= toupper(string[i]);
         }if (isalpha(string[0]))
                        {
                          string[0]=toupper(string[0]);
                        }
         }
}

person 4reel77    schedule 17.11.2013    source источник
comment
если это: string[i]= toupper(string[i]) не жалуется из-за const характера параметра string, получите новый компилятор. Этот параметр должен быть char string[]. И вы хотите strlen(string), а не strlen(string[i]). И полностью потерять строку return Cap. Это void функция.   -  person WhozCraig    schedule 18.11.2013
comment
да, у меня есть ошибка в этой строке, назначение местоположения только для чтения   -  person 4reel77    schedule 18.11.2013


Ответы (8)


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

#include <stdio.h> // Now I am able to use printf.
#include <string.h> // I was not able to use strlen without this...

void Cap(char string[]){     
    int i;
    int x = strlen(string); // You want to get the length of the whole string.
    for (i=1;i<x;i++){
         if (isalpha(string[i]) && string[i-1] == ' '){ 
         // only first letters of a word.
             string[i]= toupper(string[i]);
         }
    }
}

main(){
  char string[] = "text with lowercase words.";
  Cap(string);
  printf("%s",string);
};

Тем не менее, первое слово текста в нижнем регистре. Это задача для вас.

person Stefan Bollmann    schedule 17.11.2013
comment
хорошо, я добавил исправление для первой строки в массиве: if (isalpha (string [0])) {string [0] = toupper (string [0]); } - person 4reel77; 18.11.2013
comment
Я отклонил это предложение из-за нескольких ошибок. Сначала строка начинается со строки [0], а не со строки [1]. И ваш тест проверки того, что перед символом является "", не работает для самого первого символа в строке (поскольку вы будете проверять за пределами переменной, которая может содержать любой символ). - person Deanie; 06.10.2016

вы можете захотеть запустить strlen(string) - поскольку strlen(string[i]) пытается получить длину одного символа.

person ordahan    schedule 17.11.2013

Я также отмечу, что ваши брекеты не подходят ...

if (isalpha(string[i])){
       string[i]= toupper(string[i]);

Удалите фигурную скобку в строке if или поставьте закрывающую скобку после оператора присваивания.

person Slate    schedule 17.11.2013

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

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

Однако самая большая проблема в том, что это не массив строк. Это массив символов, представляющий собой всего одну строку. char* string и char string[] оба (потенциально) относятся к массиву символов, который составляет одну строку. Вам нужно будет использовать другой уровень косвенности для ссылки на массив массивов символов: char** strings, char* strings[] или char strings[][]. Последняя форма потребует указать длину всех строк, поэтому обычно используются только первые две.

person tychon    schedule 17.11.2013
comment
хорошо, спасибо за ответ, я понял и исправил первые две ошибки, я добавлю, что хочу передать одно предложение, например, предложение char [10] = это пример, поэтому char string [] подойдет? - person 4reel77; 18.11.2013
comment
слова в массиве предполагают, что это массив слов, отсюда и путаница. Да, вы можете использовать char string[], если вы просто хотите использовать слова в строке с заглавной буквы. Однако вам нужно будет проверить какое-то разделение между словами, прежде чем вы попытаетесь сделать первую букву заглавной, поскольку ваша текущая логика будет просто использовать заглавные буквы во всех словах. - person tychon; 18.11.2013

Проблема здесь в том, что вы передаете одну строку, а не массив строк.

В основном в C строка представляет собой массив символов, следовательно, массив строк представляет собой двумерный массив, например:

const char* strings[];

Есть еще несколько проблем с кодом. Вы не инициализировали i перед его использованием.

person wybourn    schedule 17.11.2013

альтернативный подход: (напишите функцию)

1) (необязательно) Выделить память для нового буфера такой же длины для результатов в вызываемой функции.
2) In function - устанавливает первый символ новой строки в верхний регистр исходной строки
3) Поиск пробелов в строке.
4) Для каждого пробела установите для следующего символа новой строки верхний регистр символа в исходной строке
5) Повторяйте цикл 4) до тех пор, пока не будет обнаружен NULL
6) Освободите всю выделенную память в вызывающей программе.

Пример кода:

void capitalize(char *str, char *new)
{
    int i=0;

    new[i] = toupper(str[0]);//first char to upper case
    i++;//increment after every look
    while(str[i] != '\0')
    {
        if(isspace(str[i])) 
        {
            new[i] = str[i];
            new[i+1] = toupper(str[i+1]);//set char after space to upper case
            i+=2;//look twice, increment twice
        }
        else
        {
            new[i] = str[i];//for no-space-found, just copy char to new string      
            i++;//increment after every look
        }
    }
}
person ryyker    schedule 18.11.2013

Это должно работать нормально.

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

capital(char s[])
{
    int i;
    for(i=0; i<strlen(s); i++)
    {
        if (i==0||s[i-1]==' '&&s[i]>='a'&&s[i]<='z')
            s[i]=toupper(s[i]);
    }
    puts(s);
}

main()
{
    char s[100];
    printf("Enter a line: ");
    gets(s);
    capital(s);
}
person A.K. Tarafder    schedule 09.08.2014
comment
Было бы лучше, если бы вы расширили свой ответ, объяснив задающему вопрос, почему его компилятор выдает эту ошибку, а не просто предоставляет готовый код. - person MacK; 09.08.2014

Я сделал обновление на основе ответа Стефана Боллманна:

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

char* uc_words(char string[])
{
    int i;
    int x = strlen(string);
    int counter = 0;

    for (i = 0; i < x; i++)
    {
        // If found a white-space reset counter
        if (isspace(string[i]))
            counter = 0;

        // Check if first character in word
        if (isalpha(string[i]) && !isspace(string[i]) && counter == 0)
        {
            string[i]= toupper(string[i]);
            counter = 1;
        }
    }

    return string;
}

int main()
{
    char string[] = "hello world";
    printf("%s\n", uc_words(string));

    return 0;
}
person Crazenezz    schedule 26.12.2014