【问题标题】:Example: scanf and char errors示例:scanf 和 char 错误
【发布时间】:2012-07-08 00:26:06
【问题描述】:

我正在阅读 C for Dummies 并在书中做一个示例。它告诉我一行一行地写出来。然后它继续阅读本书,即使代码有错误。这里是:

#include <stdio.h>

int main()
{

char me[20];
printf("What is your name?");
scanf("%s",&me);
printf("Darn glad to meet you. %s!\n".me);

return(0);

}  

根据 gcc:

WHORU.C:在函数“int main()”中:WHORU.C:8:19:警告:格式“%s” 需要“char*”类型的参数,但参数 2 的类型为“char” (*)[20]' [-Wformat] WHORU.C:9:43: 错误:请求成员“我”在 ‘"很高兴认识你。%s!\012"’,它是非类类型‘const 字符[28]'

因为我是 C 新手,所以我真的无法指出我哪里做错了。我知道这段代码在执行时需要输入。这有点像 java 中的扫描仪。

谢谢大家。

【问题讨论】:

    标签: c char scanf


    【解决方案1】:
    scanf("%s",&me);
    

    应该是:

    scanf("%s",me);
    

    scanf() 接收指向您传递的变量的指针。但是在 C 中,数组在传递时会衰减为指针,因此不需要&amp;

    另一个错误是,您在 printf 中有一个 .,它应该是一个 ,

    printf("Darn glad to meet you. %s!\n".me);
    

    应该是:

    printf("Darn glad to meet you. %s!\n",me);
    

    【讨论】:

      【解决方案2】:

      您只需使用 scanf("%s",me); 即可解决您的问题。在 C 中me[] 等价于*me

      【讨论】:

        【解决方案3】:

        我会大胆猜测scanf("%s",&amp;me); 应该是scanf("%s",&amp;me[0])scanf("%s",me),因为&amp;me 是一个指向字符数组的指针,而&amp;me[0] 是指向一个字符开头的单个字符的指针字符数组。我个人更喜欢第一种方法,因为它对我来说似乎更合乎逻辑,例如“获取数组中第一个字符的地址”

        另外,printf("Darn glad to meet you. %s!\n".me); 应该有一个逗号,而不是字符串和“me”之间的句点,因为 me 是 printf 函数的参数。当您使用句点时,它会在字符串“Darn 很高兴见到你。%s!\n”上寻找一个名为“me”的成员,该成员不存在。你在java中也会遇到同样的问题,所以我猜这只是一个错字。

        【讨论】:

        • 使用 &me 很好,因为数组只能通过地址传递,所以 &me 和 me 具有相同的(指针)值 - 如果不同的类型。
        • 可能是这样,但是 &me 会生成一个警告,而我和 &me[0] 不会因为类型正确。仅仅因为某些东西可以编译和工作并不意味着你应该那样做。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-25
        • 1970-01-01
        • 2012-07-10
        • 2016-10-22
        • 2015-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多