openlang

通过指针输入字符数组

每次尝试从键盘往一些 char 数组里输入内容,程序最后都会崩溃。

有什么简单方便的方法,可以从键盘读取 char 数组并保存下来?

int main() {
    int pos;
    char *labels[8];
    for (pos=0; pos<8; ++pos) {
        scanf("%s",labels[pos]);
    }
    for (pos=0; pos<8; ++pos) {
        printf("%s\n",labels[pos]);
    }
    return 0;
}
从英语翻译查看原文

后续讨论 2

顺着彼此的依据读下去
  1. 固定链接

    声明 char *labels[8] 创建的是一个指针数组。如果没有用有效地址初始化,这些指针就会指向无效的内存位置。因此,尝试通过它们写入会导致未定义行为。

    在使用这些指针之前,一定要确保它们指向已分配的有效内存位置。

    从英语翻译查看原文
  2. 固定链接

    这些指针组成了一个指向 char 的数组,但它们并没有引用任何有效内存。

    先为这些指针分配存储空间。

    int main(void)
        int pos;
        char *labels[8];
        for (pos=0; pos<8; ++pos) {
            labels[pos]=malloc(LABELCAP);
            scanf("%17s",labels[pos]);
        }
        for (pos=0; pos<8; ++pos) {
            printf("%s\n",labels[pos]);
            free(labels[pos]);
        }
        return 0;
    }

    另一种做法是

    int main(void) {
        int pos;
        char labels[8][LABELCAP];
        for (pos=0; pos<8; ++pos) {
            scanf("%17s",labels[pos]);
        }
        for (pos=0; pos<8; ++pos) {
            printf("%s\n",labels[pos]);
        }
        return 0;
    }
    从英语翻译查看原文

同一个问题的其他角度

  1. 同样的 sink 调用,这一行是拷贝,下一行就是移动

    Nim 2 是按调用点决定拷贝还是移动的,不是按 proc。 同一个参数,同一个 proc。第一次调用会拷贝,因为后面还要用 a。第二次就移动了。调用点上没有任何东西告诉你是哪种。nim c --expandArc:main 会打印改写后的函数体,两…

    回复 2最近活动 nim
  2. 让清理块真正执行时才开始可变借用

    怎样在 Rust 中写一个 panic 安全的机制,类似 Java 的 try { ... } finally { ... },同时允许 try 和 finally 块分别可变借用同一个值? 我需要的是,无论正常离开还是因 panic 栈展开而离开…

    回复 2最近活动 rust
  3. 输入函数能不依赖全局变量吗?

    我想写一个函数,处理并过滤用户输入,然后把得到的字符串返回给调用它的函数。 能不能不声明下面例子中的这种全局变量,也实现这个功能?

    回复 2最近活动 c