整数指针缓冲区跳过索引
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);
您混淆了 int
和 int*
。我敢猜测你的系统 sizeof(int) == 4
和 sizeof(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
}
有几个问题:
- 在声明
buf[]
时声明了一个指向整数的指针数组而不是一个整数数组,要声明一个整数数组,请使用int buf[BUFLEN];
- 对
scanf()
的调用未能限制允许用户输入的字符数。这允许用户溢出 input[]
缓冲区,导致 未定义的行为 ,这可能导致段错误事件
- 对
scanf()
的调用无法检查返回值以确保操作成功
- 每次调用
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
这很奇怪。
我有一个整数指针缓冲区。我接受一个输入,并将其附加到缓冲区。只是,当我调试时,我看到它在每个输入之间放置了一个 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);
您混淆了 int
和 int*
。我敢猜测你的系统 sizeof(int) == 4
和 sizeof(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
}
有几个问题:
- 在声明
buf[]
时声明了一个指向整数的指针数组而不是一个整数数组,要声明一个整数数组,请使用int buf[BUFLEN];
- 对
scanf()
的调用未能限制允许用户输入的字符数。这允许用户溢出input[]
缓冲区,导致 未定义的行为 ,这可能导致段错误事件 - 对
scanf()
的调用无法检查返回值以确保操作成功 - 每次调用
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