c - scanf 成一个字符串数组

标签 c arrays string scanf

<分区>

有人可以解释为什么这不能正常工作吗?我得到 stack{0 through 4] 与 stack[4] 中的内容相同

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

int stack_pointer = 0;
char *stack[30]; //MAX NUMBER OF VALUES IN STACK IS 30

int main(int argc, char** argv) {

    char command_line[256];

    while(stack_pointer < 5) {  //Just store 5 inputs
        printf("repl> ");
        scanf("%s",command_line);
        stack[stack_pointer] = command_line;  
        stack_pointer++;
    }   

    int i = 0;
    for(i = 0; i<5; i++) {
        printf("stack[%d] =  %s\n", i, stack[i]);
    }
}

例如)

回复1
回复> 2
回复> 3
回复> 4
回复> 5
堆栈[0] = 5
堆栈[1] = 5
堆栈[2] = 5
堆栈[3] = 5
堆栈 [4] = 5

最佳答案

您正在将字符指针 command_line 存储在每个堆栈位置,并为每个输入覆盖 command_line 缓冲区的内容。因此,每个堆栈位置都指向同一个缓冲区,其内容将是写入其中的最后一个输入。

你需要每次都制作一个缓冲区的副本,并在每个堆栈位置存储一个指向副本的指针。例如:

stack[stack_pointer] = strdup(command_line);

请注意,在某些时候,在实际程序中,您需要释放 strdup 分配的内存。当您使用完堆栈的内容时:

while (stack_pointer >= 0) free(stack[--stack_pointer]);

关于c - scanf 成一个字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21859597/

相关文章:

c++ - 位运算和移位问题

针对 80k 行的 PHP 数组优化

c - 如何从函数返回二维字符串数组到C中的主函数? [警告]从不兼容的指针类型返回

java - Java 中 String 相对于 StringBuilder 的优势

c - 是什么名字?

c - C语言如何输入字母退出程序

c sscanf 和 SCNu64 编译错误

iphone - 如何将 NSArray 用作全局常量?

javascript - 编写一个名为 'maker' 的函数,它创建一个数组并用数字 1 到 25 填充该数组,然后返回该数组

c - 用 C 实现 OpenGL 中的绝对定位