Я не могу найти заглавные буквы в строке в C Программирование - PullRequest
0 голосов
/ 29 марта 2019

У меня проблема с домашней работой.Мне нужно прочитать строки из файла, и мне нужно найти слова, которые начинаются с заглавной буквы, и мне нужно написать их в новом векторе.Шаг 1 сделан, мне нужно использовать функцию для этих шагов, и я не могу использовать библиотеку, кроме <stdio.h>

Пример:

Исходная строка: перо - красный Новый вектор:Ручка, красная

Мой код:

#include <stdio.h>
#define dim 150
void lettura(int vett1[]); // reading function
void capitalLetter(int vett1[], int vett2[], int i);

main()
{    
    char vett1[dim];
    char vett2[dim];
    int i;
    lettura(vett1);
    capitalLetter(vett1, vett2, i);
}

void lettura(int vett1[])
{
    FILE *fp;
    char nomefile[dim];
    printf("--> Inserisci il nome del file: \n\n", &nomefile); // "insert the name of the file"
    gets(nomefile);
    printf("\n--> Il contenuto del file e' il seguente: \n\n"); // "the content of the file is the following"
    fp= fopen("file.txt","r");
    while(!feof(fp)) {
    fgets(vett1, dim, fp);
    printf("%s", vett1);

    }  // I close the while

    fclose(fp);
}  // I close the function


void capitalLetter(int vett1[], int vett2[], int i)
{
    for(i=0; i<dim; i++){
    if((vett1[i]>= 'A') && (vett1[i]<= 'Z'))
    vett1=vett2;
    }

    printf("%s", vett2);
}

1 Ответ

0 голосов
/ 29 марта 2019

Первая проблема с вашей функцией capitalLetter заключается в неправильном определении параметров.

void capitalLetter(int vett1[], int vett2[], int i);

Ожидается, что вы передадите 2 массива int, но вы передадите его в двамассивы char.Ваш компилятор должен выдавать некоторые предупреждения об этой разнице типов, я надеюсь.Вы бы хотели, чтобы это выглядело так:

void capitalLetter(char vett1[], char vett2[], int i);

Ваш цикл может выходить за пределы конца строки, поскольку вы не проверяете его конец - вы проверяете размервесь массив.Вы должны остановить цикл, когда найдете такой NUL-символ, как этот.

for(i=0; vett1[i]!='\0'; i++)

Я не знаю, что вы пытались сделать с этой строкой:

vett1=vett2;

, но это нене имеет никакого смысла, так как это будет замена строки, которую вы обрабатываете, на пустую.Если вы хотите, чтобы vett2 содержал заглавные буквы, вы должны изменить эту строку на

vett2[j++]=vett1[i];

, что, как вы, вероятно, можете догадаться, также означает добавление новой переменной j.Он заполняет массив vett2 каждой заглавной буквой и использует j, чтобы он начинался с начала и заполнял его по мере продвижения, поскольку вы не можете использовать i, так как это оставит пробелы.

Вы также передаете переменную i без видимой причины.Вы можете объявить локальную копию в самой функции вместе с j.

int i, j = 0;

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

vett2[j]='\0';

Конечный результат будет выглядеть примерно так:

void capitalLetter(char vett1[], char vett2[]) {
    int i, j = 0;
    for(i=0; vett1[i]!='\0'; i++) {
        if((vett1[i]>= 'A') && (vett1[i]<= 'Z')) {
            vett2[j++]=vett1[i];
        }
    }
    vett2[j]='\0';
    printf("%s", vett2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...