在C语言中处理字符串时出现问题

5

我是一个C语言的新手,有两个可能很蠢的问题。

我正在学习C语言中的结构体,这里是我卡住的地方。假设我们有以下这样的结构体:

typedef structs {
  char model[50];
  int yearOfManufacture;
  int price;
} Car;

Car Ford;
Ford.yearOfManufacture = 1997;
Ford.price = 3000;

//The line below gives me an error "Array type char[50] is not assignable
Ford.model = "Focus"

在这种情况下,如何将文本传递到Ford.model中?

我的第二个问题也与字符串有关。 这段代码可以正常工作。

char model[50] = "Focus";
printf("Model is %s", model);

但是这个不行。
char model[50];
model = "Focus";

有人能解释一下为什么它不起作用吗?

你的问题与结构体完全无关,而是关于字符串的相同问题两次。 - Karl Knechtel
5个回答

5

4

“将值放入对象”有两种方法:

  • 初始化:创建对象时
  • 赋值:对象创建后

尽管语法相似,但它们代表不同的概念。

你可以初始化数组,但不能赋值。

此外,还有一种特殊结构可用于基于字符串文字初始化字符数组。

char arr[] = "foobar";
char arr[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'};
int arr[] = {1, 2, 3, 4};
// ...

但是,分配必须逐个元素完成。
char arr[4];
arr[0] = arr[1] = arr[2] = 'X';
arr[3] = '\0';
int arr[4];
arr[0] = arr[1] = arr[2] = 42;
arr[3] = -1;

使用库函数 strcpy()(原型在 <string.h> 中)是一种将 char 数组的元素逐个赋值的“特殊”方法,只需要一个语句即可实现。

#include <string.h>
int main(void) {
    char arr[10];
    strcpy(arr, "foo"); // same as arr[0]='f'; arr[1]=arr[2]='o'; arr[3]='\0';
    return 0;
}

1

这个 (Ford.model = "Focus") 是不可能的。 你必须将字符串复制到结构体中的数组中,最好使用 strcpy

strcpy(Ford.model, "Focus");

如果您的stdlib支持,您也应该考虑使用一个溢出安全版本,例如strncpy:
strncpy(Ford.model, "Focus", sizeof Ford.model);

至少我认为这是一个扩展函数而不是标准函数... 我不确定。


这是标准的,但是C99标准,并非每个平台都支持。在Win32上,它们有它,但被命名为_snprintfsprintf_s - wormsparty

0

你不能使用=给字符数组赋值,只能初始化它。

当你写

char model[50] = "Focus";

这是一个初始化。

当你写代码时

model = ...

这是一个赋值操作。正如我所说,不允许对字符数组进行赋值。

您需要使用strcpy()将其复制到字符数组中,例如:strcpy(model, "Focus")


0

在定义时可以分配一个字符串,但在任何其他地方,您必须使用不同的方法,例如strcpy()函数:

char model[50];
strcpy(model, "Focus");

你可以在定义时进行初始化,而不是在声明时。通常它们(声明和定义)同时发生,但你也可以将声明与定义分开。 - pmg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接