C函数使用指针打印字母表



我有这个代码:

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

这是假设打印所有的英文字母,但有一个运行时错误,我需要找出原因和如何修复它。我试过任何我想到的方法来修复它,但都无济于事,它只是打印了很多随机的东西。感谢您提前提供的帮助。P.S:这不是我写的代码,我只需要找到错误并修复它。

停止的条件

p < p + len

不会像在循环的每次迭代中执行p++那样为false。您最终访问了无效的内存位置,这会导致"未定义的行为"one_answers"这就是导致运行时错误的原因"。要修复它,请使用另一个变量

char *tmp=p+len;

并将条件更改为

p < tmp

另一种方法是在每次迭代中递减CCD_ 2。一旦len为零时退出循环:

void printArray(char* p, int len)
{
    for( p ; len ; --len )
    {
        printf("%c", (*p)++);
    }
    printf("n");
}

每次循环迭代都会使用p的增量值来计算表达式p + len。这使得循环超出数组的边界,从而触发未定义的行为。

你需要预先计算一个超过终点的循环

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

但您不需要传递长度,只需迭代,直到找到尾部的,如果您不打算修改传递的字符串,请使用const char *:

void printArray(const char *p)
{
    while (*p) {
        printf("%c", *p++);
    }
    printf("n");
}

最新更新