Scanf和地址运算符(&)在循环内部不起作用

时间:2018-10-30 20:10:41

标签: c variables scanf

我有一个分配,我想知道为什么当我编译并运行此代码时,library(stringr) x <- c( "\nFolsom Field, University of Colorado, Boulder, CO (9/3/72)", "\nHollywood Palladium, Hollywood, CA (9/9/72)", "\nThe Spectrum, Philadelphia, PA (5/1/2010) " ) ##String trim is just to cut trailing spaces states <- str_trim(str_extract(x, "\\s[A-Z]{1,2}\\s")) states 没有将数据存储在地址中。我知道这一点,因为在下一个scanf("%d", &temp_pin)语句中,我只是被赋予随机变量。在较早的代码行中,我还有另一个scanf语句可以工作,而我只是为为什么不这样做而感到困惑。非常感谢!

printf("%d", temp_pin)

3 个答案:

答案 0 :(得分:1)

如果我可以提出一个建议,那就是将所有整数数组都变成整数。这将解决您所有的问题。但是,如果您的作业需要使用整数数组,请遵循以下代码。

当前,您仅将temp_pin的第一个元素设置为等于用户输入。行scanf(" %d", &temp_pin);实际上将一个整数存储到temp_pin[0]中。

由于引脚大小为4,因此需要读取4个独立的整数才能存储在数组中。我建议使用for循环,该循环可以设置temp_pin[0], temp_pin[1], temp_pin[2], temp_pin[3]

的值

从逻辑上讲,我也建议对每个整数进行错误检查,因为整数的大小可以在-32,768到32,767之间。当前具有元素3300,55,12,15的整数数组将是有效的引脚。

printf(" %d", temp_pin);行中给您的值不是随机变量。这是临时引脚的地址。为了打印存储在temp_pin中的值,您需要遍历数组中的每个元素并单独打印。

对于您的比较语句if (temp_pin==pin),由于它正在比较地址,因此永远不会得出true。同样,正确的解决方法是同时遍历两个列表并比较每个元素。

答案 1 :(得分:0)

您已将temp_pin声明为整数的数组,因此&temp_pin是指向数组的指针,类型为int (*)[4]%d格式说明符期望使用int *

类似地,在打印时,您传递的数组temp_pin会衰减为指向第一个元素的指针,并且该地址就是要打印的内容。

temp_pin的类型和其他声明为数组的变量更改为int并删除循环。

int pin = 1234;
int temp_pin;
int new_pin;
int temp_new_pin;

...

if (option == 1)
{
    printf("\nPlease Enter Your PIN\n");

    scanf(" %d", &temp_pin);
    printf(" %d", temp_pin);

    if (temp_pin==pin)
    {
        printf("\nYour PIN is correct\n");
    }
    else
    {
        printf("\nYour PIN is incorrect\n");
    }
}//End If

答案 2 :(得分:0)

您尝试通过一个scanf调用读取一个数组,但是它确实像c中那样工作。请注意,temp_pin已经是数组中第一个元素的地址。 线

scanf("%d", temp_pin);

等同于该行

scanf("%d", &(temp_pin[0]));

,它将读取值并将其存储在temp_pin[0]中。

为了读取整个数组,您需要执行以下操作:

for (int i=0; i<4; i++) scanf("%d", &(temp_pin[i]));

同一个故事进行比较。您无法通过一个==操作来比较两个数组。表达式temp_pin == pin比较的地址尽管存储在这些数组中的实际值总是不同的。为了比较两个数组,您需要执行以下操作:

int isEqual = 1; // a flag for whether arrays are equal 
for (int i=0; i<4; i++) {
    if (temp_pin[i] != pin[i]) {
        isEqual = 0; 
    }
}
if (isEqual) printf("pins are the same\n");
else printf("pins are not the same\n");