【问题标题】:scanf into a string array [duplicate]scanf 到一个字符串数组中[重复]
【发布时间】:2014-02-18 16:25:04
【问题描述】:

有人可以解释为什么这不能正常工作吗?我得到堆栈{0 到 4] 与堆栈中的内容相同[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]);
    }
}

前)

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

【问题讨论】:

  • stack[stack_pointer] = strdup(command_line);
  • 指针指向同一个地方(到命令行)。

标签: c arrays string scanf


【解决方案1】:

您将 char 指针 command_line 存储在每个堆栈位置并覆盖每个输入的 command_line 缓冲区的内容。所以每个堆栈位置都指向同一个缓冲区,其内容将是最后写入的输入。

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

stack[stack_pointer] = strdup(command_line);

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

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

【讨论】:

  • 我会添加一条关于释放 strdup 创建的内存的评论
  • @halfbit:好点 - 更新了。
  • isedev:非常感谢!现在说得通了!
【解决方案2】:

你的堆栈[指针] 指向command_line的开头

所以堆栈数组的所有元素都指向同一个位置,即持有最后一个结果

你正在用每个循环覆盖这个内存位置。

【讨论】:

    【解决方案3】:

    编辑:哎呀,重复了我的答案,sry

    你的堆栈[指针] 指向command_line的开头

    所以堆栈数组的所有元素都指向同一个位置,即持有最后一个结果

    你正在用每个循环覆盖这个内存位置。

    编辑:其他解决方案不是最好的,但显示指针:

    int stack_pointer = 0;
    char *stack[30]; //MAX NUMBER OF VALUES IN STACK IS 30
    
    int main(int argc, char** argv) {
    
       char command_line[32000];  // not save! just for ex. here never do that in real life
       char *p=command_line;      // p points to start of ...
    
       while(stack_pointer < 5) {  //Just store 5 inputs
          printf("repl> ");
          scanf("%s",p);          // p points to start of (next) command line position
          stack[stack_pointer] = p;  
          stack_pointer++;
    
          p+=strlen(p)+1;           // move the 'p' pointer after the last string (and its '0x00')
       } 
    }  
    

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 1970-01-01
      • 2013-08-04
      • 2019-07-02
      • 2015-08-22
      • 2017-08-02
      • 1970-01-01
      • 2011-07-27
      • 2016-07-28
      相关资源
      最近更新 更多