C语言初学者

时间:2017-06-27 11:17:37

标签: c

我在Youtube视频之后学习C语言,并且我有几个问题。

我在Xcode中输入以下内容

#include<stdio.h>

int main()  // 1. why do we have to use this line?
{
  char food[] = "tuna";

  printf("the best food is %s",food);
  strcpy(food,"bacon");  // error here
  return 0;
}
  1. 当我输入所有这些时,错误就出现了&#34;宣称图书馆功能不明确&#39; strcpy&#39;类型&#39; char*(char*,const char*)&#39;&#34;
  2. 我不知道这是什么意思以及它为什么会发生?很抱歉打扰问题的人,但我需要你的帮助。谢谢

4 个答案:

答案 0 :(得分:2)

C是一门非常好的语言,但是由于与python,javascript等相比它的级别有多低。你需要做很多手动任务,包括内存管理。

但在我们开始之前,您的初始问题不包括string.h标头。一旦包含该标题,您实际上会获得分段错误。

以下是您获取分段错误原因的说明。

所以当你定义: char food[] = "tuna"

C创建了5个字节的char数组。为什么5?因为所有字符串都以NULL字节结尾('\0')。

所以你的内存中的字符串看起来像"tuna\0"

旁注:

NULL字节的重要性是表示字符串的结尾。当您使用printf之类的功能时,这非常重要。因为在打印字符串时,printf将查找NULL字节以停止打印。

因此,此char数组的最大大小为5个字节,1为空字节,因此只有4个字节(字符)的可写内存。

然后你试着复制&#34;培根&#34;进入你的5字节数组。

所以strcpy尝试复制b,然后是c,然后是o,然后是n,然后当它试图用NULL字节终止字符串时,它会因为你试图访问a而出错您无法访问的内存字节。

因此,为了解决您的问题,您可以尝试strcpy与原始字符串长度相同或更短的字符串。或者您可以查看strdup之类的内容并使用指针。

该代码如下所示:

#include <stdio.h>
#include <string.h>

int main()
{
  char *food = "tuna";

  printf("the best food is %s\n",food);

  food = strdup("bacon");

  printf("the best food is %s\n",food);

  return 0;
}

希望这有帮助!

答案 1 :(得分:0)

  1. 我们必须使用main(),这是执行C程序的函数。
  2. 要使用strcpy()(预定义函数),您需要先声明它。它的声明出现在string.h中,所以只有#include<string.h> 这将解决您的问题。implicit declaring library function 'strcpy' with type&#39; char *(char *,const char *)``
  3. 声明

    时还有一个问题

    char food[]="tuna";

    你只为你分配5个字节,4个用于字符,还有一个用于NULL。当您尝试将bacon放入其中时(使用strcpy()),这是6个字节长。它会导致编译器创建分段错误。

答案 2 :(得分:0)

我建议你练习解释一下这段代码的行为。您必须了解C语言如何将“字符串”管理到内存中。

我在下面发布的代码不正确,包含违反为变量food分配的空间。在这种情况下,此代码不会生成分段错误,但它可能会生成这样的错误!

如果使用gcc -Wall --pedantic -std=c99 prgname.c 编译下面的代码,编译器不会发出警告或错误信号,但代码不正确。

注意! :)

#include <stdio.h>
#include <string.h>

int main()  // 1. why do we have to use this line?
{           //  --- 'cause is a standard!!! :)
  char food[] = "tuna";
  char b[]="prova";

  printf("the best food is %s - %s - food-size %u\n",food,b,(unsigned int)sizeof(food));
  strcpy(food,"fried or roasted bacon");  // error here
  printf("the best food is %s - %s - food-size %u\n",food,b,(unsigned int)sizeof(food));

return 0;
}

答案 3 :(得分:-1)

除了其他人所说的内容外,请注意strcpy(char * destination, const char * source )

  

为避免溢出,目标指向的数组大小应足够长,以包含与源相同的C字符串(包括终止空字符),并且不应在内存中与源重叠。

如果您的目的地太小,您可能会遇到segmentation fault