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

时间:2015-03-29 06:59:59

标签: c string pointers runtime-error alphabet

我有这段代码:

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:这不是我写的代码,我只需找到错误并修复它。

3 个答案:

答案 0 :(得分:2)

停止的条件

p < p + len

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

char *tmp=p+len;

并将条件更改为

p < tmp

另一种方法是在每次迭代中递减lenlen为零后退出循环:

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

答案 1 :(得分:1)

每次循环迭代都会计算表达式p + len,每次使用递增的值p。这使循环超出了数组的范围,触发了未定义的行为。

您需要预先计算一个超出循环外结束点的那个

char* end = p + len;

for( p ; p < end ; p++ )
{
    printf("%c", *p);
}

答案 2 :(得分:1)

下面:

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

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

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