创建自定义大写方法

问题描述 投票:0回答:2

我正在尝试创建一个大写方法(我不能在库中使用它因为我的软件不支持它)。问题是,当我在输出中使用我的方法总是我的字符串的最后结果。我无法真正理解问题究竟在哪里。我相信我不会以正确的方式处理指针。

这是一个例子:

进入初始化:

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
c mplab
2个回答
0
投票

你的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等于4时i将保留“test4”。所以你必须纠正控制表达式for循环也是如此。

但是,如果要保留Register中的值并在for循环后打印它们,则必须使Register注册为二维数组并将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]); 
}

看到这个example


0
投票

你的问题是,你返回txt。

Txt只是一个本地字符指针,仅存在于函数ToUpper中。

寄存器[I] = ToUpper的(P);

您将该指针分配给Register [i]。

现在再次调用ToUpper,旧的txt将被下一个字符TEST2覆盖。

现在注册[0]指向文本TEST2的开头。

这一直持续到最后一次使用test4。

然后注册[0..3]都指向相同的位置,这将是最后一个txt-characteres(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长度。

© www.soinside.com 2019 - 2024. All rights reserved.