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");
}