【问题标题】:Problems with scanf and strings in a while loopwhile循环中scanf和字符串的问题
【发布时间】:2016-06-21 21:27:08
【问题描述】:

我不明白我的程序的这部分代码有什么问题。 我正在使用 while cicle 要求用户插入一个字符串,该字符串将保存到一个临时 (char *name) 字符串中,然后作为函数的参数传递。然而问题是当我使用 scanf 函数时。这是代码:

char *name;
size_t i=0;

while(i<size){
    printf("Insert #%zu item name: ",i+1);
    scanf("%s",name);
    printf("Insert #%zu item price: ",i+1);
    scanf("%u",&price);
    item=item_cons(item,name,price);
    i++;
}

【问题讨论】:

  • However the problem is when I use scanf function 是什么?
  • 抱歉,我忘记插入了。好的,这就是问题所在:当我插入它打印 (size) 次的字符串时,插入 1-2-3-4-...-size 项目名称并插入 1..size 项目价格

标签: c string pointers scanf


【解决方案1】:

在您的代码中

scanf("%s",name);

您没有为指针name 分配内存。它指向无效内存位置并尝试使用它来存储任何值都会调用undefined behavior

您需要先将内存分配给name,然后才能使用它将任何内容存储在它指向的内存中。你可以

  • name 设为一个数组,例如char name[32] = {0};,然后像scanf("%31s",name); 一样使用它(通常首选

或者,

  • 将动态内存分配给char *name,使用malloc() 或family。

【讨论】:

  • 我使用了 name=malloc(sizeof(char*)*size);它的工作原理谢谢你!
  • @Gio 不,它看起来不像,相反,您可能想要name= malloc( sizeof(*name) * size); 注意:1)您需要检查malloc() 是否成功 2)您必须在之后释放内存。数组有什么问题?
  • 等等,仅仅因为它有效,并不意味着它是正确的。 name=malloc(sizeof(char*)*size); 是错误的,因为你想为chars 分配内存,而不是char *s...见我之前的评论^。
  • 最好说name 缺少初始化——它的内容没有被指定。 C 没有指定name 指向一个无效的内存位置。
  • 顺便说一句:“尝试使用(通过取消引用)存储任何值将调用未定义的行为。”是真的,即使读取 pointer 的值也是 UB。
【解决方案2】:

尝试使用 字符名称[100]={'\0'} 这假设您将获得的较大名称是 10

【讨论】:

  • 添加一些解释,说明此答案如何帮助 OP 解决当前问题
猜你喜欢
  • 2015-01-12
  • 2014-04-26
  • 2023-03-14
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2020-10-24
  • 2021-11-04
  • 2015-01-30
相关资源
最近更新 更多