为什么我会收到有关此代码示例的警告?什么是正确的?

时间:2015-01-06 19:29:18

标签: c

我正在学习一些C,正在scanfthis tutorial阅读,其中包含以下代码块:

#include <stdio.h>

int main()
{
   char str1[20], str2[30];

   printf("Enter name: ");
   scanf("%s", &str1);

   printf("Enter your website name: ");
   scanf("%s", &str2);

   printf("Entered Name: %s\n", str1);
   printf("Entered Website:%s", str2);

   return(0);
}

但是我得到警告:

"Format specifies type 'char *' but the argument has type 'char (*)[20]'

教程错了吗?

3 个答案:

答案 0 :(得分:13)

这应该适合你:

#include <stdio.h>

int main()
{
   char str1[20], str2[30];

   printf("Enter name: ");
   scanf("%19s", str1);
         //^^   ^ Removed address operator
         //So only the right amount of characters gets read   

   printf("Enter your website name: ");
   scanf(" %29s", str2);
        //^ Added space to catch line breaks from the buffer

   printf("Entered Name: %s\n", str1);
   printf("Entered Website:%s", str2);

   return(0);
}

答案 1 :(得分:7)

本教程示例中存在一个错误。

变化:

scanf("%s", &str1);

scanf("%s", str1);

s转换说明符需要指向char的指针,但是您正在传递指向数组的指针。

答案 2 :(得分:3)

scanf("%s", &str1);

scanf("%s", &str2);

确实是错的(至少,它们都包含错字)。他们应该写成

scanf("%s", str1);  // no & operator

scanf("%s", str2); // ditto

数组和数组表达式在C中是特殊的。除非它是sizeof或一元&运算符的操作数,或者是一个字符串文字用于初始化声明中的另一个数组,表达式类型&#34; N元素数组T&#34;将被转换(衰减)为类型为&#34的表达式;指向T&#34;的指针,表达式的值将是数组的第一个元素的地址。

表达式 str1具有char&#34;类型&#34; 20元素数组。如果str1出现在它不是sizeof或一元&运算符的操作数的上下文中,它将转换为&#34;类型的表达式char&#34;,表达式的值与&str1[0]相同;这就是为什么你不需要使用&来读取字符串,因为数组表达式将被视为指针。但是,当它是一元&运算符的操作数时,转换规则不适用,而表达式&str1的类型是&#34;指向20-的指针元素数组char&#34; (char (*)[20])。因此你的警告。

str1&str1将是相同的(第一个元素数组的地址与数组的地址相同),但类型表达式是不同的,类型很重要。指向char的指针将与指向char数组的指针区别对待。

90%的C书籍和教程都是废话;对任何不是实际标准的C参考都持怀疑态度。哈比森&amp;斯蒂尔的C: A Reference Manual(目前是第5版)自80年代末以来一直是我的首选参考,但即使它有小错误。