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