我正在try 将字符串字面赋值给字符array.

这段代码运行良好

#include <stdio.h>

struct student
{
    char* name;
};

struct student s[2];

void main()
{
    s[0].name = "jason";
    s[1] = s[0];

    printf("%s%s", s[0].name, s[1].name);

    s[1].name = "fedin";

    printf("%s%s", s[0].name, s[1].name);
}

但这段代码不起作用:

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

struct item {
  char* itemName;
  int quantity;
  float price;
  float amount;
};

void readItem(item* const p) {
  printf("Please enter item name. \n");
  fgets(p->itemName, 50, stdin);
  for (int i = 0; i < strlen(p->itemName); i++)
  {
    if (p->itemName[i] == '\n') {
      p->itemName[i] = NULL;
    }
  }

  printf("Please enter the quantity. \n");
  scanf_s("%d", &p->quantity);

  printf("Please enter the price. \n");
  scanf_s("%f", &p->price);
}

void print(item* const p) {
  printf("Item Name: %s \n", p->itemName);
  printf("Quantity: %i \n", p->quantity);
  printf("Price: %.4f \n", p->price);

  p->amount = (p->quantity) * (p->price);
  printf("Amount: %.4f \n", p->amount);
}

int main(void) {
  struct item item1;

  item1.itemName = "SDfsd";

  item1.quantity = 0;
  item1.price = 0.0;
  item1.amount = 0.0;

  struct item* itemP = &item1;

  readItem(itemP);
  print(itemP);

  free(itemP->itemName);
  itemP->itemName = NULL;

  return 0;

}

编译器给我的错误:

Error (active)  E0513 a value of type "const char *" cannot be assigned to an entity of type "char *" Structure Pointers and Functions  F:\Mohamed Taha\Codes\C Programming\C Programming For Beginners\vs\Structure Pointers and Functions\Structure Pointers and Functions\mian.cpp 41  

像往常一样,我试着先问ChatGPT,但它没有给我任何解释.它说错误是因为字符串文字在只读内存中,所以您不能写入它们,但这没有任何意义,因为第一个代码可以工作.

注意:这两段代码在同一个编译器上运行.

推荐答案

因为struct item不是typedef,所以函数参数应该在前面加上struct关键字;否则,item是无法识别的.

void readItem(struct item* const p)
void print(struct item* const p)

另外,请注意,NULL扩展为((void *)0),而不是char.如果要设置空终止符,则需要在此处使用'\0'0:

p->itemName[i] = NULL; // Should be = '\0' or 0

是的,C不会为itemName本身分配内存,因此使用malloc:

p->itemName = (void *)malloc(sizeof(char) * 50);
printf("Please enter item name. \n");
.
.

现在,它运行得很好:

Please enter item name. 
test
Please enter the quantity. 
3
Please enter the price. 
2
Item Name: test 
Quantity: 3
Price: 2.0000
Amount: 6.0000

C++相关问答推荐

生成C代码时自动复制/生成' tmwtypes.h '依赖项

了解一些CLIPS原语数据类型

Ebpf内核代码:permission denied:invalid access to map value

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

MISRA C:2012 11.3违规强制转换(FLOAT*)到(uint32_t*)

为什么C语言允许你使用var =(struct NAME){

为什么I2C会发送错误的数据?

&;(str[i])和(&;str)[i]有什么区别?

在句子中转换单词的问题

#定义SSL_CONNECTION_NO_CONST

如何仅使用软件重新初始化STM32微控制器中的USB枚举?

如何在C-函数中混合使用C代码和ASM?

不同原型的危险C函数是可能的

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

安全倒计时循环

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

即使客户端不发送数据,也会发生UNIX套接字读取

函数指针作为函数参数 - 应该使用 const 吗?

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组