整数指针缓冲区跳过索引

integer pointer buffer skipping indices

这很奇怪。

我有一个整数指针缓冲区。我接受一个输入,并将其附加到缓冲区。只是,当我调试时,我看到它在每个输入之间放置了一个 0。

  int *buf[BUFLEN];
  char input[BUFLEN];
  int temp;
  printf("To move to the next step, enter q or quit\n");
  printf("Please enter an integer then press Enter to insert integer into the list:\n");
  while(1){
    scanf("%s", input);
    if (!strcmp(input, "q") || !strcmp(input, "quit"))
      break;
    buf[list_count] = atoi(input);
    list_count++;
  }

这是 lldb 向我展示的内容

(lldb) p *(int(*)[20])buf
(int [20])  = {
  [0] = 9
  [1] = 0
  [2] = 8
  [3] = 0
  [4] = 7
  [5] = 0
  [6] = 6
  [7] = 0
  [8] = 5
  [9] = 0
  [10] = 4
  [11] = 0
  [12] = 3
  [13] = 0
  [14] = 2
  [15] = 0

这很奇怪,因为当我执行 p buf 时,它是正确的 -- 但我的整个程序不工作,所以我认为我的错误在这里

(lldb) p buf
(int *[256])  = {
  [0] = 0x0000000000000009
  [1] = 0x0000000000000008
  [2] = 0x0000000000000007
  [3] = 0x0000000000000006
  [4] = 0x0000000000000005
  [5] = 0x0000000000000004
  [6] = 0x0000000000000003
  [7] = 0x0000000000000002
  [8] = 0x0000000000000001

此外,如何将 atoi() 返回的整数分配给整数指针数组?

也就是说,我有...

int *buf[BUFLEN];
scanf("%s", input);
buf[list_count] = atoi(input);

您混淆了 intint*。我敢猜测你的系统 sizeof(int) == 4sizeof(int*) == 8

这意味着您的缓冲区看起来像这样:

0x00000000 0x00000009
0x00000000 0x00000008
0x00000000 0x00000007
0x00000000 0x00000006

如果您将它们打印为 int*,那将是四个条目,但如果您将它们打印为 int,它将是 8 个,每个第二个为零。


Also, how can I assign a atoi() returned integer into an array of integer pointers?

我不确定您要做什么。您是否正在尝试从用户那里读取指针(即地址)?在那种情况下,你做得还不错,只需要演员表,所以:

buf[list_count] = (int*)atoi(input);

编译器应该在那里给你一个警告。不要忽略那些。

如果您试图获取用户提供给您的 int 的地址.. 它并不是那样工作的。首先,您需要将 int 存储在某个地方,在单独的 int intbuffer[BUFSIZE]; 中,然后使用该元素的地址。

关于您发布的代码(此处显示有评论)

  int *buf[BUFLEN];   // array of pointers to integers
  char input[BUFLEN]; // array of characters
  int temp;           // unused variable

  printf("To move to the next step, enter q or quit\n");
  printf("Please enter an integer then press Enter to insert integer into the list:\n");

  while(1)
  {
    scanf("%s", input);   // inputs unlimited number of characters
                          //     (ended by use pressing enter)
                          // fails to check returned value (not parameter value)
                          //     to assure op was successful)

    if (!strcmp(input, "q") || !strcmp(input, "quit")) 
      break;

    buf[list_count] = atoi(input); // tries to convert input from char string to integer
                                   // and place result into some pointer
                                   // which raises compiler warning
    list_count++;                  // undefined variable
  }

有几个问题:

  1. 在声明buf[]时声明了一个指向整数的指针数组而不是一个整数数组,要声明一个整数数组,请使用int buf[BUFLEN];
  2. scanf() 的调用未能限制允许用户输入的字符数。这允许用户溢出 input[] 缓冲区,导致 未定义的行为 ,这可能导致段错误事件
  3. scanf() 的调用无法检查返回值以确保操作成功
  4. 每次调用 scanf() 都会失败,因为没有规定从输入流中使用 <newline>。 (并且 scanf() 在遇到任何 white space 时停止输入字符(如用户按下 'enter' 键产生的白色 space)

评论列出了发布的代码中的一些其他问题。

建议代码更像下面这样:

  int  buf[BUFLEN];   // array of integers
  char input[BUFLEN]; // array of characters   

  printf("To move to the next step, enter q or quit\n");
  printf("Please enter an integer then press Enter to insert integer into the list:\n");

  // note limiting the number of inputs so do not overrun `buf[]`
  for( int list_count=0; list_count < BUFLEN; list_count++ )
  {    
       // note checking returned value
       // note leading space in format string to consume white space
       // note limiting number of char that user can input
       if( 1 != (scanf("% *s", BUFLEN-1, input) ) )
       {
            perror( "scanf failed" );
            exit( EXIT_FAILURE );
       }

       // implied else, scanf successful

       if (!strcmp(input, "q") || !strcmp(input, "quit")) 
           break;

       buf[list_count] = atoi(input);
  } // end for