Создание пользовательского метода в верхнем регистре - PullRequest
0 голосов
/ 10 сентября 2018

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

Вот пример:

Для инициализации:

char *Register[5];

Внутри моего времени:

char *p;
int i =0;
for(i=0;i<=4;i++)
{
    if(i==0)p="test1";
    if(i==1)p="test2";
    if(i==2)p="test3";
    if(i==3)p="test4";
    Register[i]=ToUpper(p);
}
Eusart2_Write(Register[0]);
__delay_ms(20);
Eusart2_Write(Register[1]);
__delay_ms(20);
Eusart2_Write(Register[2]);
__delay_ms(20);
Eusart2_Write(Register[3]);

А вот мой верхний метод:

char *ToUpper(char *string)
{
    int i=0;
    char txt[255]="";
    char Buffer[255]="";

    strcpy(Buffer,string);

    for(i = 0; i<=strlen(Buffer); i++)
    {
        if(( Buffer[i]>='a')&&( Buffer[i]<='z'))
            txt[i]=Buffer[i] - 32; 
        else
            txt[i]= Buffer[i];  
    }
    txt[i++]='\0';

    return txt;
}

В своем выводе я беру одинаковый результат для всех регистров:

TEST4TEST4TEST4TEST4

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Ваша проблема в том, что вы возвращаете TXT.

Txt - только локальный указатель на символ, который существует только внутри функции ToUpper.

С

Регистрация [I] = ToUpper (р);

Вы назначаете этот указатель для Register [i].

Теперь вы снова вызываете ToUpper, и старый текст будет перезаписан следующими символами TEST2.

Теперь регистр [0] указывает на начало текста TEST2.

Это продолжается до последнего вызова с test4.

Затем зарегистрируйте [0..3] все точки в одном и том же месте, и это будет началом последних txt-символов (TEST4). Таким образом, вы печатаете TEST4 4 раза.

(Большая проблема в том, что память txt больше не выделяется и может изменяться в любое время во время выполнения)

Это работает в вашем случае, но не очень хороший код, потому что он использует фиксированный размер ваших тестовых строк. Но потом ты сможешь очистить себя.

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

char *Register[5];

char *ToUpper(char *const string)
{
    int i=0;

    for(i = 0; i<=strlen(string); i++)
    {
        if(( string[i]>='a')&&( string[i]<='z'))
            string[i]=string[i] - 32;   
    }

    return string;
}

int main () {
    int i =0;
    for(i=0;i<=4;i++)
    {
        Register[i]=(char*)malloc(strlen("testN"));
        if(i==0)strcpy(Register[i],"test1");
        if(i==1)strcpy(Register[i],"test2");
        if(i==2)strcpy(Register[i],"test3");
        if(i==3)strcpy(Register[i],"test4");
        ToUpper(Register[i]);
    }
    printf("%s",Register[0]);
    printf("%s",Register[1]);
    printf("%s",Register[2]);
    printf("%s",Register[3]);

   return(0);
}

обратите внимание, что код работает только потому, что фиксированные размеры ваших примеров. Поскольку я не знаю, что вы хотите сделать, измените фиксированную длину malloc так, как вам это нужно.

0 голосов
/ 10 сентября 2018

Ваш массив txt является локальным для функции ToUpper. Как только он выходит из области видимости, вы не можете гарантировать, каким будет его содержимое. Поэтому, если ваша переменная Register является глобальной, вы также можете сделать массив txt глобальным.

Во-вторых, вы пишете только после преобразования ВСЕХ строк в верхний регистр. Таким образом, даже если ваш массив txt был глобальным, он будет содержать только то, что записано в него совсем недавно (то есть «TEST4»). Решение этой проблемы - написать сразу после конвертации. Поэтому переместите запись в цикл for следующим образом:

for(i=0;i<=4;i++)
{
    if(i==0)p="test1";
    if(i==1)p="test2";
    if(i==2)p="test3";
    if(i==3)p="test4";
    Register[i]=ToUpper(p);
    Eusart2_Write(Register[i]);
    __delay_ms(20);
}

Примечание: у вас есть только четыре строки в цикле for, который имеет 5 итераций, поэтому, когда вы напишите, вы в конечном итоге напишите TEST4 дважды, потому что p сохранит «test4», когда i равно 4. Так что Вы также должны исправить управляющее выражение в цикле for.

Однако, если вы хотите сохранить значения в Register и распечатать их после цикла for, вам необходимо зарегистрировать двумерный массив и скопировать в него возвращаемое значение ToUpper.

Ваша регистрационная декларация будет выглядеть так:

char Register[5][6];  

и ваш цикл for будет выглядеть так:

for(i=0;i<4;i++)
{
    if(i==0)p=(char*)"test1";
    if(i==1)p=(char*)"test2";
    if(i==2)p=(char*)"test3";
    if(i==3)p=(char*)"test4";
    strcpy(Register[i], ToUpper(p));
    printf("%s\n", &Register[i]); 
}

См. пример .

...