创建自定义大写方法

时间:2018-09-10 07:24:49

标签: c mplab

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

这里是一个例子:

初始化:

public static String Sign(String data, String key)
{
    KeyedHashAlgorithm algorithm = new HMACSHA256();
    Encoding encoding = new UTF8Encoding();
    algorithm.Key = encoding.GetBytes(key);
    return Convert.ToBase64String(algorithm.ComputeHash(
        encoding.GetBytes(data.ToCharArray())));
}

在我的一段时间内:

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;
}

2 个答案:

答案 0 :(得分: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在{{1 }}等于4。因此,您还必须在i循环中更正控制表达式。

但是,如果要保留for中的值并在Register循环后打印它们,则必须使Register成为二维数组并复制{{1}的返回值}。

您的注册声明将如下所示:

for

,您的for循环将如下所示:

ToUpper

请参阅此example

答案 1 :(得分:0)

您的问题是,您返回txt。

Txt只是一个本地char指针,仅在函数ToUpper内部存在。

使用

  

Register [i] = ToUpper(p);

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

现在您再次调用ToUpper,旧的txt将被下一个字符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长度。