我正在尝试创建一个大写方法(我无法从库中使用它,因为我的软件不支持它)。问题是,当我在输出中使用我的方法时,总是来 self 的字符串的最后结果。我实在无法理解到底问题出在哪里。我相信我没有以正确的方式处理指针。
这是一个例子:
进入初始化:
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
最佳答案
您的 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 创建为二维数组并复制返回值将 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 .
关于创建自定义大写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52252946/