创建自定义大写方法

Creating a custom uppercase method

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

这是一个例子:

进入初始化:

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++]='[=12=]';

    return txt;
}

在我的输出中,我对所有寄存器采用相同的结果:

TEST4TEST4TEST4TEST4

您的 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循环后打印它们,那么你必须使Register成为一个二维数组并复制return 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

你的问题是,你 return txt.

Txt 只是一个局部字符指针,只存在于 ToUpper 函数中。

Register[i]=ToUpper(p);

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

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

现在Register[0]指向文本TEST2的开始。

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

然后 Register[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 长度。