【问题标题】:How to increment character pointer? [duplicate]如何增加字符指针? [复制]
【发布时间】:2018-07-18 04:50:38
【问题描述】:

代码给了我错误:lvalue required as increment operand

但如果我将str 加 1,它必须指向字符串中的下一个字符。

#include <stdio.h>
#include <stdlib.h>


int main()
{
    char str[50];
    scanf("%s", str);
    while(*str != 0)
    {
        printf("%c", *str);
        str++;
    }
    return 0;
}

【问题讨论】:

  • 这与C++无关,所以请不要使用C++标签。
  • ...除非您使用 C++,否则不要使用 C 标签。请在应用之前阅读标签的描述!

标签: c++ c pointers


【解决方案1】:

str 不是指针而是数组。在许多情况下,数组衰减为指向其第一个元素的指针,但这并不能使其本身成为指针。

【讨论】:

    【解决方案2】:

    str 是一个 50 元素的 char 数组,而不是指针。在大多数情况下,数组会衰减(转换为)指向第一个元素的指针,但您不能修改衰减的指针,除非您使用该指针的副本这样做。

    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main()
    {
        char str[50];
        char* ptr = str;
        scanf("%s", str);
        while(*ptr != 0)
        {
            printf("%c", *ptr);
            ptr++;
        }
        return 0;
    }
    

    正如 Ulrich Eckhardt 所指出的,实现这一点的更好方法是使用 for 循环:

    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main()
    {
        char str[50];
        scanf("%s", str);
        for(char* ptr = str; *ptr != 0; ++ptr)
        {
            printf("%c", *ptr);
        }
        return 0;
    }
    

    这样更清楚,ptr 的范围仅限于循环这很好,因为我们以后不需要它。

    【讨论】:

    • for (char* ptr = str; *ptr != 0; ++ptr) -- 更清晰的恕我直言,也不会将ptr 泄漏到周围的范围内。
    • @UlrichEckhardt 好主意,我只是不想过多地更改代码。我会把它添加进去。
    【解决方案3】:

    你可以简单地把它当作一个数组来使用

    int i;
    for (i=0; i<sizeof(str); i++)
    {
            printf("%c", str[i]);
    }
    

    【讨论】:

    • 首先,sizeof() 是一种类型的语法(例如sizeof(int)),当参数是表达式时,没有括号:sizeof str 在您的情况下是适当的语法,尽管您编写的内容按预期编译和运行。我还想补充一点,这仅在 str 是当前范围内的 char 数组时才有效。如果传递给函数,它会衰减为指针,sizeof str 将等价于sizeof(char*)...
    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 2015-05-15
    • 2015-02-12
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多