Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
while循环中的scanf和字符串问题_C_String_Pointers_Scanf - Fatal编程技术网

while循环中的scanf和字符串问题

while循环中的scanf和字符串问题,c,string,pointers,scanf,C,String,Pointers,Scanf,我不明白我程序的这部分代码出了什么问题。 我使用while循环请求用户插入一个字符串,该字符串将被保存为临时(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: "

我不明白我程序的这部分代码出了什么问题。 我使用while循环请求用户插入一个字符串,该字符串将被保存为临时(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++;
}
char*名称;
尺寸i=0;
而(i在您的代码中

scanf("%s",name);
您没有为指针
name
分配内存。它指向无效的内存位置,并试图使用它存储将调用的任何值

您需要将内存分配给
name
,然后才能使用该内存在其指向的内存中存储任何内容

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

  • 使用
    malloc()
    或family将动态内存分配给
    char*name
在您的代码中

scanf("%s",name);
您没有为指针
name
分配内存。它指向无效的内存位置,并试图使用它存储将调用的任何值

您需要将内存分配给
name
,然后才能使用该内存在其指向的内存中存储任何内容

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

  • 使用
    malloc()
    或family将动态内存分配给
    char*name
尝试使用 字符名[100]={'\0'} 这假设您将获得的较大名称是10 字符名[100]={'\0'}
这假设您将获得的较大名称是10,但问题是当我使用scanf函数时它是什么?哦,对不起,我忘了插入它。好的,这就是问题:当我插入它打印的字符串时(大小)times insert 1-2-3-4-…-尺寸项目名称和insert 1..size项目价格
但是问题是当我使用scanf函数时
它是什么?哦,对不起,我忘了插入它。好的,这就是问题:当我插入它为(尺寸)打印的字符串时,times insert 1-2-3-4-…-尺寸项目名称和insert 1..size项目价格我使用的名称=malloc sizeof(char*)*大小);它可以工作,谢谢你!@Gio不,它看起来不像,相反,你可能想要
name=malloc(sizeof(*name)*size);
Note:1)你需要检查
malloc()
2)是否成功,然后你需要释放内存。数组有什么问题?等等,仅仅因为它工作,并不意味着它是正确的<代码>名称=malloc(sizeof(char*)*size)
错误,因为您希望为
char
s分配内存,而不是
char*
s。。。请参阅我前面的评论^。最好说
name
缺少初始化-未指定其内容。C没有指定
名称
指向无效的内存位置。顺便说一句:“尝试使用(通过反引用)存储任何值将调用未定义的行为。”为真,甚至读取指针值也是UB。我使用了name=malloc(sizeof(char*)*size);而且很有效谢谢你@Gio不,它看起来不像,相反,您可能需要
name=malloc(sizeof(*name)*size)注意:1)您需要检查
malloc()
2)是否成功,然后才能释放内存。数组有什么问题?等等,仅仅因为它工作,并不意味着它是正确的<代码>名称=malloc(sizeof(char*)*size)
错误,因为您希望为
char
s分配内存,而不是
char*
s。。。请参阅我前面的评论^。最好说
name
缺少初始化-未指定其内容。C没有指定
名称
指向无效的内存位置。顺便说一句:“尝试使用(通过反引用)存储任何值将调用未定义的行为。”是真的,并且有点令人惊讶,即使读取指针值也是UB。添加一些关于此答案如何帮助OP解决当前问题的解释以及关于此答案如何帮助OP解决当前问题的解释