2013-06-28 154 views
1

我刚刚学习如何在C语言中编写代码,这是我的第一个非网页语言,并没有一个好的开始。C代码无法正常工作

我有以下代码:

// 
// main.c 
// Greeting 
// 
// Created by Austen on 2013-06-27. 
// Copyright (c) 2013 Austen. All rights reserved. 
// 

#include <stdio.h> 

int main() 
{ 
    int confirm[100]; 
    char name[100]; 
    char mood[100]; 

    printf("Please enter your name: "); 
    scanf("%s", name); 
    printf("Hey there, %s . How are you? ", name); 
    scanf("%s", mood); 
    printf("Oh, you are %s?. Enter 1 or 0: ", mood); 
    scanf("%i", confirm); 
    if (confirm == 1) { 
     printf("Oh good!"); 
    } 
    else { 
     printf("Make up your mind"); 
    } 
    getchar(); 
    return(0); 

} 

出于某种原因,我不能得到它的工作,我不得不改变一些东西,以便Xcode的停在我呻吟了那么很多原因。 它给了我一个

warning: Comparison between pointer and integer int* and int 

当我运行它,即使我输入1,它告诉我,来弥补我的脑海里。

任何帮助都会很棒,所以下次我会更好。这可能很简单。

+0

从'scanf'获取整数,给它一个参数“%d”。 – MYMNeo

+0

确认不应该是一个数组。只需'int confirm;' –

+0

为了将来的参考,如果您可以提供从输出中复制和粘贴的完整警告消息,这很有用。 C很费劲,而且阅读/格式化警告的行为通常会让你意识到你一直忽略的一些东西。欢迎来到SO :-) – Alex

回答

4

无需创建一个数组来保存答案为confirm,正常int会做:

int confirm; 

但是因为scanf需要一个指针,所以你需要像这样传递它的地址:

scanf("%d", &confirm); 

最后,这个 - scanf("%i", confirm);实际上应该是这个 - scanf("%d", &confirm);

%d是整型变量的标准格式化字符。

之后,一切都编译好。

C总是按值传递,因此scanf无法将您输入的值存储在提供的变量中,除非它到达内存所在的内存中并直接写入内存。

这就是为什么它要求变量的内存地址,而不是变量本身(你提供了一个地址前面加上&)。

当作为参数传递给函数时,数组已经被当作地址(指针更精确,指针存储某个地址),这就是为什么你不这样做的原因。

关于指针和数组的一些信息here

+1

Omg。它的工作原理:P非常感谢你<3 – Austen

+0

但你能解释为什么我需要添加&? – Austen

+1

这是因为您需要将指针传递给'confirm'的内存地址,这就是'&'操作符的作用。 –

2

使用%d的整数(用于确认)

确认被声明为一个数组,但你只想要一个简单的整数。在声明中删除confirm后面的[100]。它应该是;

int confirm; 

你得到的警告是因为confirm是一个数组,它试图数组的基址(确认)比较,以一个整数值(1)。

当你声明一个数组,数组的基址是在数组名可用。(如:confirm这里)

更换scanf线这需要confirm

scanf("%d",&confirm); 

它应该工作正常

+0

仍然收到相同的问题=/ – Austen

+0

还有一个错误....确认被声明为一个数组....再次看到答案 –

3

你得到那个警告的原因是因为你正在比较一个100整数的数组到1个整数。正确的代码会是这样的

if (confirm[0] == 1) 

或更容易

int confirm; 
scanf("%d", &confirm); 
if (confirm == 1)