我正在尝试创建一个大写方法(我不能在库中使用它因为我的软件不支持它)。问题是,当我在输出中使用我的方法总是我的字符串的最后结果。我无法真正理解问题究竟在哪里。我相信我不会以正确的方式处理指针。
这是一个例子:
进入初始化:
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
等于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。
你的问题是,你返回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长度。