C函数使用指针打印字母表
C function to print the alphabet using pointers
我有这个代码:
void printArray(char* p, int len)
{
for( p ; p < p + len ; p++ )
{
printf("%c", *p);
}
printf("\n");
}
int main()
{
char* abc = "abcdefghijklmnopqrstuvwxyz";
printArray(abc, 26);
return 0;
}
本来应该打印所有的英文字母,但是有一个运行-time error,我需要找出它的原因以及如何修复它。
我已经尝试了我想到的任何方法来修复它,但没有任何帮助,它只是打印了很多随机的东西。
我在这里先向您的帮助表示感谢。
P.S: 这不是我写的代码,我只是需要找到错误并修复它。
停止条件
p < p + len
不会像您在循环的每次迭代中所做的 p++
那样为假。您最终访问了无效的内存位置,这会导致未定义的行为,这就是导致运行时错误的原因。要修复它,请使用另一个变量
char *tmp=p+len;
并将条件更改为
p < tmp
另一种方法是在每次迭代中递减 len
。一旦 len
为零,退出循环:
void printArray(char* p, int len)
{
for( p ; len ; --len )
{
printf("%c", (*p)++);
}
printf("\n");
}
表达式 p + len
对每次循环迭代进行评估,每次使用 p
的增量值。这使得循环超出数组的边界,触发未定义的行为。
你需要预先计算出循环外的结束点
char* end = p + len;
for( p ; p < end ; p++ )
{
printf("%c", *p);
}
这里:
for( p ; p < p + len ; p++ )
p < p + len
始终为真。
你需要这样的东西:
void printArray(char* p, int len)
{
char *end = p + len; /* sum before the for loop */
for( p ; p < end ; p++ )
{
printf("%c", *p);
}
printf("\n");
}
但是你不需要传递长度,只是迭代直到找到尾随的[=14=]
,如果你不打算修改传递的字符串,使用const char *
:
void printArray(const char *p)
{
while (*p) {
printf("%c", *p++);
}
printf("\n");
}
我有这个代码:
void printArray(char* p, int len)
{
for( p ; p < p + len ; p++ )
{
printf("%c", *p);
}
printf("\n");
}
int main()
{
char* abc = "abcdefghijklmnopqrstuvwxyz";
printArray(abc, 26);
return 0;
}
本来应该打印所有的英文字母,但是有一个运行-time error,我需要找出它的原因以及如何修复它。 我已经尝试了我想到的任何方法来修复它,但没有任何帮助,它只是打印了很多随机的东西。 我在这里先向您的帮助表示感谢。 P.S: 这不是我写的代码,我只是需要找到错误并修复它。
停止条件
p < p + len
不会像您在循环的每次迭代中所做的 p++
那样为假。您最终访问了无效的内存位置,这会导致未定义的行为,这就是导致运行时错误的原因。要修复它,请使用另一个变量
char *tmp=p+len;
并将条件更改为
p < tmp
另一种方法是在每次迭代中递减 len
。一旦 len
为零,退出循环:
void printArray(char* p, int len)
{
for( p ; len ; --len )
{
printf("%c", (*p)++);
}
printf("\n");
}
表达式 p + len
对每次循环迭代进行评估,每次使用 p
的增量值。这使得循环超出数组的边界,触发未定义的行为。
你需要预先计算出循环外的结束点
char* end = p + len;
for( p ; p < end ; p++ )
{
printf("%c", *p);
}
这里:
for( p ; p < p + len ; p++ )
p < p + len
始终为真。
你需要这样的东西:
void printArray(char* p, int len)
{
char *end = p + len; /* sum before the for loop */
for( p ; p < end ; p++ )
{
printf("%c", *p);
}
printf("\n");
}
但是你不需要传递长度,只是迭代直到找到尾随的[=14=]
,如果你不打算修改传递的字符串,使用const char *
:
void printArray(const char *p)
{
while (*p) {
printf("%c", *p++);
}
printf("\n");
}