2014-09-18 37 views
-3

在这里你可以看到我的源代码:很少有新手的问题,与scanf函数和转换说明问题

#include <stdio.h> 

int main() 
{ 
    char yourname; 
    char yoursex; 
    int yourage = 0; 

    printf("Hey, what's your name?\n"); 
    printf("My name is: "); 
    scanf("%s", &yourname); 
    printf("Oh, hello %s! \n\n", &yourname); 

    printf("Are you a boy or a girl?: "); 
    scanf("%s", &yoursex); 
    printf("Nice to know you are a %s! \n\n", &yoursex); 

    printf("How old are you %s? I am ", &yourname); 
    scanf("%d", &yourage); 
    printf("I see you are %d, you have many years then!", &yourage); 

    return 0; 
} 

我尝试的事情,我不知道了,奇怪的是它不是为我工作。有什么问题?另外,为什么它需要%s而不是%c?如果我使用%c,它不起作用!

它说: 你几岁?而不是把我的名字,它说''OY''

而不是在最后一行显示我的年龄,它显示了一个很大的数字。

非常感谢你,编程是复杂的,但是很有成就感:)

+0

'char'表示*一个字符*。您不能在其中存储名称。 – 2014-09-18 23:08:21

回答

2

这些都是C语言程序设计非常基本的,我强烈建议你得到一个体面的书 - 由丹尼斯里奇C程序设计语言会一个好的开始。

代码中有许多错误。

  1. 一个char只能包含一个字符,如 'A',或 'A' 或类似的东西。当你扫描一个名字时,它将成为一组字符,比如'E','d','d','y'。要存储多个字符,您需要使用字符数组。此外,用于扫描/打印字符的格式说明符是%c,%s适用于需要扫描一组字符时,也称为字符串的数组。

  2. 当您使用printf,你不提供一个指向你要打印变量(&x是一个指针变量x)。指针是一个32/64位整数,这很可能就是为什么当您尝试打印时看到一个随机整数。 printf("%c\n", charVar)就足够了。同时使用%s作为格式说明

  3. scanf并不需要一个&,假设你通过一个字符数组作为参数。原因是,scanf需要知道在哪里存储您正在从输入读取的数据 - 这是由指向内存位置的指针给出的。当你需要扫描一个整数时,你需要通过一个&x - 这意味着指向x的内存位置。但是,当你传递一个字符数组时,它已经是一个内存地址的形式,并且不需要在一个和符之前。

我再一次推荐你在网上查找一些体面的教程,或者得到一本书(我上面提到的是一本经典的书)。输入材料中给出的示例。实验。玩的开心。 :)

0

这是一个单字符

char yourname; 

但是%s表示该变量是一个(即,由一个NUL终止字符数组)。这就是为什么你需要%c。如果你真的打算用字符串,然后定义像

char yourname[32]; /* just pick a big enough size */ 

同样的变量,你是正确使用的的变量地址与scanf(),但printf()需要的价值。因此,而不是

printf("I see you are %d, you have many years then!", &yourage); 

使用

printf("I see you are %d, you have many years then!", yourage); 

“大数目” 是内存地址。

1

%s用于读取字符串 - 多个字符由空格分隔。 %c用于读取单个字符。

您将yournameyoursex变量声明为字符,然后尝试将字符串读入它们中。读取的字符串会覆盖堆栈帧中随机的其他内容,并导致错误或崩溃。

要声明yournameyoursex为字符数组,这样他们就可以容纳字符串:

char yourname[32]; 
char yoursex[32]; 

然后,读入他们的时候,你要包括长度的限制,使他们不溢出:

scanf("%31s", yourname); 
0

请确保您阅读了代码中的注释!

#include <stdio.h> 

int main() 
{ 
    char yourname[10]; 
    char yoursex[5]; // boy or girl + null terminator 
    int yourage = 0; 

    printf("Hey, what's your name?\n"); 
    printf("My name is: "); 
    scanf("%s", &(*yourname)); // & and * cancel each other out, 
    // thus take a look at the next scanf() 
    printf("Oh, hello %s! \n\n", yourname); // yourname is now an array 

    printf("Are you a boy or a girl?: "); 
    scanf("%s", yoursex); 
    printf("Nice to know you are a %s! \n\n", yoursex); 

    printf("How old are you %s? I am ", yourname); 
    scanf("%d", &yourage); // ok 
    printf("I see you are %d, you have many years then!", yourage); // here you don't 
    // need the address of the variable! 

    return 0; 
} 
0

表达char yourname;仅持有单个字符的空间,所以很有可能你最终会在扫描时提供yourname损坏的内存空间。您应该分配一个更大的缓冲区,并确保您不会超过其长度,方法是设置要用scanf函数读取的最大字符数;如其他一些答案中所述。

事实上,以下printf打印正确的名称并不意味着内存不会损坏;因为C/C++不会真正检查运行时使用的任何字符串或数组的边界。

正如其他人所建议的,首先阅读一本关于C和/或C++的好书并不是一个坏主意。