我正在尝试创建一个大写方法(由于软件不支持,我无法从库中使用它)。问题是,当我在输出中使用我的方法时,字符串中总是有最后一个结果。我真的不明白问题到底出在哪里。我相信我不会以正确的方式处理指针。
这里是一个例子:
初始化:
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;
}
答案 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长度。