c-实现自定义输入函数



我尝试了两种不同的方法来构建一个接受用户字符串输入并将其存储在变量中的函数。

实施A

char* input(size_t size)
{
char buffer[size];
char* str = (char*)malloc(sizeof(char) * sizeof(buffer));
if (fgets(buffer, size, stdin) != NULL)
{
buffer[strcspn(buffer, "n")] = '';
printf("Buffer says: %sn", buffer);
strncpy(str, buffer, sizeof(buffer));
str[sizeof(buffer) - 1] = '';

printf("str inside function says: %sn", str);
return str;
}  
return NULL;
}

实现B

int input2(char* str, size_t size)
{
char buffer[size];

str = (char*)malloc(sizeof(char) * sizeof(buffer));
if (fgets(buffer, size, stdin) != NULL)
{
buffer[strcspn(buffer, "n")] = '';
printf("Buffer says: %sn", buffer);
strncpy(str, buffer, sizeof(buffer));
str[sizeof(buffer) - 1] = '';

printf("str inside function says: %sn", str);
return 0;
}  
return -1;
}

main.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libs/custom/myio.h"
int main(int argc, char const *argv[])
{
char *ip1;

ip1 = input(1000);
printf("ip1 inside main says %sn", ip1);
free(ip1);
char* ip2;
input2(ip2, 1000);
printf("ip2 inside main says %sn", ip2);
free(p2);
return 0;
}

运行程序时:

Hi                             # user input
Buffer says: Hi
str inside function says: Hi
ip1 inside main says Hi
Hi                             # user input
Buffer says: Hi
str inside function says: Hi
ip2 inside main says (null)

A运行良好,但B则不然A不是我想要使用的方法,我更喜欢使用B

当我尝试将valgrind与gdb一起调试时,它似乎在检测printf函数中的错误(??(。

==177193== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
==177193== 
==177193== 1 errors in context 1 of 2:
==177193== Conditional jump or move depends on uninitialised value(s)
==177193==    at 0x48D71C2: __vfprintf_internal (vfprintf-internal.c:1688)
==177193==    by 0x48C1EBE: printf (printf.c:33)
==177193==    by 0x109276: main (main.c:19)
==177193==  Uninitialised value was created by a stack allocation
==177193==    at 0x109209: main (main.c:7)
==177193== 
==177193== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

我做了很多研究,但我仍然不知道为什么B不起作用。

函数input2("实现B"(中的问题是行

str = (char*)malloc(sizeof(char) * sizeof(buffer));

将仅修改函数input2中的指针变量str,该指针变量包含函数main中的变量ip2的值的副本。它不会在函数main中设置原始变量ip2的值。

如果您希望变量ip2受到这行代码的影响,那么,您不应该将变量ip2的值传递给函数input2,而应该通过将函数的参数更改为以下内容来传递指向该变量的指针:

int input2( char** str, size_t size )

并通过改变线路

str = (char*)malloc(sizeof(char) * sizeof(buffer));

至:

*str = (char*)malloc(sizeof(char) * sizeof(buffer));

现在,当调用main中的函数input2时,不应该传递ip2的值,而应该传递该变量的地址,如下所示:

input2( &ip2, 1000 );

现在,这个变量也应该受到函数input2的变化的影响。

此外,值得注意的是,在C中(与C++相反(,不必投射malloc的结果。请参阅此问题以获取更多信息:我是否强制转换malloc的结果?

相关内容

  • 没有找到相关文章

最新更新