openlang

输入函数能不依赖全局变量吗?

我想写一个函数,处理并过滤用户输入,然后把得到的字符串返回给调用它的函数。

能不能不声明下面例子中的这种全局变量,也实现这个功能?

#include <stdio.h>

char entry[12]; // globals aren't appealing!
char *read_entry() {
    scanf("%s",entry);
    return entry;
}

int main(void) {
    printf("%s",read_entry());
}
从英语翻译查看原文

后续讨论 2

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

    在 main() 内声明一个字符指针,然后把这个指针作为参数传给 read_entry()。

    #include <stdio.h>
    
    char *read_entry(char *entry) {
        scanf("%s",entry);
        return entry;
    }
    
    int main(void) {
        char entry[12]; // Storage must be reserved
        printf("%s",read_entry(entry));
    }
    从英语翻译查看原文
  2. 固定链接

    能不能不声明下面例子中的这种全局变量,也实现这个功能?

    当然可以,另一个回复已经演示了。

    不过,不要把所有全局变量一概说成 unappealing,它们也有适用的地方。

    还要记得,C 支持模块作用域,模块内部能访问这些对象,外部却看不到。这类变量也值得考虑。

    因此,下面这样写完全合理。

    #include <stdio.h>
    
    static char entry[12]; // Module scope is fine
    static char *read_entry() {
        scanf("%s",entry);
        return entry;
    }
    
    int main(void) {
        printf("%s",read_entry());
    }
    从英语翻译查看原文

同一个问题的其他角度

  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. 通过指针输入字符数组

    每次尝试从键盘往一些 char 数组里输入内容,程序最后都会崩溃。 有什么简单方便的方法,可以从键盘读取 char 数组并保存下来?

    回复 2最近活动 c