【问题标题】:Array of Strings Manipulation in CC中的字符串数组操作
【发布时间】:2017-01-20 16:43:21
【问题描述】:

迭代可变字符串数组的最佳方法是什么?例如:

struct Book{
    char chapter_names[20][50];
    int chapters;
    ...}

int main(){
    struct Book Redwall;
    strcpy(*chapter_names, "The Wall");
    strcpy(*(++chapter_names), "The Grove");

    printf("Chapter 1: %s", chapter_names[0]);
    printf("Chapter 2: %s", chapter_names[1]);

    return 0;
}

我希望这个输出是:

Chapter 1: The Wall
Chapter 2: The Grove

这段代码导致

error: lvalue is required as increment operand

【问题讨论】:

  • 当你试图编译这段代码时发生了什么?
  • 将其编辑到问题中
  • chapter_names 是一个数组。你不能增加一个数组...
  • 你不能增加一个数组,无论是普通数组还是结构成员。使用索引——它并不痛苦,而且很容易阅读并且很难(呃)出错。
  • 排序,但数组不是指针。 array 转换为 &array[0] 并且它们是相同的类型,但 &array 是不同的类型(尽管具有相同的初始值)。给定int array[10];,那么&array 是一个int (*)[10]——一个指向10 个整数数组的指针;添加 1(即&array + 1)会使您访问超出数组范围,这与在范围内的array + 1 完全不同。数组不是指针。而且你不能增加数组名称。

标签: c arrays string multidimensional-array strcpy


【解决方案1】:

您不能在结构中的数组上使用这样的增量运算符。您可能正在寻找如下代码:

struct Book{
    char chapter_names[20][50];
    int chapters;
    };

    int main(){
        struct Book Redwall;
        strcpy(*(Redwall.chapter_names), "The Wall");
        strcpy(*(Redwall.chapter_names+1), "The Grove");

        printf("Chapter 1: %s\n", Redwall.chapter_names[0]);
        printf("Chapter 2: %s\n", Redwall.chapter_names[1]);

        return 0;
    }

【讨论】:

  • 为什么不在strcpy() 行中也使用Redwall.chapter_names[0] 等?理解起来会简单得多——而且速度不会慢。
  • 没错。由于 OP 对此似乎有些陌生,我只是想让他了解(a[1] == (a+1)) 的想法。所以我在作业中保留了chapter_names+1,在打印中保留了chapter_names[1]
  • 现在肯定比鼓励他们现有的坏习惯更好。
  • 所以a++ 的字面意思是a+=1,因此将a 移出边界。我想做的是通过a+1。明白了
【解决方案2】:

既然你有一个 int 来跟踪你有多少章节名称,你可能应该使用它。

Redwall.chapters = 0; // Make sure it's initialised first
strcpy(Redwall.chapter_names[Redwall.chapters++], "The Wall");
strcpy(Redwall.chapter_names[Redwall.chapters++], "The Grove");

然后你可以使用 for 循环来循环遍历它们。

for(i=0;i<Redwall.chapters;i++) {
     printf("Chapter %d: %s", i+1, Redwall.chapter_names[i]);
} 

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 2018-04-02
    • 2012-03-25
    • 2015-01-19
    • 1970-01-01
    • 2014-09-22
    • 2012-09-26
    相关资源
    最近更新 更多