这很奇怪。
我有一个整数指针的缓冲区。我接受一个输入,并将其附加到缓冲区。只是,当我调试时,我看到它在每个输入之间放置了一个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]) $19 = {
[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]) $17 = {
[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);
答案 0 :(得分:2)
您感到困惑int
和int*
。我猜想你的系统sizeof(int) == 4
和sizeof(int*) == 8
这意味着你的缓冲区看起来像这样:
0x00000000 0x00000009
0x00000000 0x00000008
0x00000000 0x00000007
0x00000000 0x00000006
如果您将它们打印为int*
,这将是四个条目,但如果您将它们打印为int
,则它将为8,每秒都为零。
另外,如何将atoi()返回的整数分配给整数指针数组?
我不确定你要做什么..你是不是想从用户那里读一个指针(即地址)?在那种情况下,你做得很好,只需要演员,所以:
buf[list_count] = (int*)atoi(input);
编译器应该在那里给你一个警告。不要忽视这些。
如果您正在尝试获取用户提供给您的int的地址,那么这种方式并不完全正常。首先,您需要将int存储在单独的int intbuffer[BUFSIZE];
中,然后使用该元素的地址。
答案 1 :(得分:0)
关于您发布的代码(此处显示注释)
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[]
缓冲区,导致未定义的行为,这可能导致seg故障事件scanf()
的调用无法检查返回的值以确保操作成功scanf()
的每次其他调用失败,因为没有规定从输入流中使用<newline>
。 (并且scanf()
在遇到任何white space
时停止输入字符(例如用户点击'enter'键产生的空白区域)评论列出了已发布代码中的其他一些问题。
建议代码更像以下内容:
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