实现自定义输入函数
Implementing a custom input function
我尝试了 2 种不同的方法来构建一个接受用户字符串输入并将其存储在变量中的函数。
实施 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")] = '[=10=]';
printf("Buffer says: %s\n", buffer);
strncpy(str, buffer, sizeof(buffer));
str[sizeof(buffer) - 1] = '[=10=]';
printf("str inside function says: %s\n", 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")] = '[=11=]';
printf("Buffer says: %s\n", buffer);
strncpy(str, buffer, sizeof(buffer));
str[sizeof(buffer) - 1] = '[=11=]';
printf("str inside function says: %s\n", 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 %s\n", ip1);
free(ip1);
char* ip2;
input2(ip2, 1000);
printf("ip2 inside main says %s\n", 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
的结果。有关详细信息,请参阅此问题:Do I cast the result of malloc?
我尝试了 2 种不同的方法来构建一个接受用户字符串输入并将其存储在变量中的函数。
实施 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")] = '[=10=]';
printf("Buffer says: %s\n", buffer);
strncpy(str, buffer, sizeof(buffer));
str[sizeof(buffer) - 1] = '[=10=]';
printf("str inside function says: %s\n", 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")] = '[=11=]';
printf("Buffer says: %s\n", buffer);
strncpy(str, buffer, sizeof(buffer));
str[sizeof(buffer) - 1] = '[=11=]';
printf("str inside function says: %s\n", 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 %s\n", ip1);
free(ip1);
char* ip2;
input2(ip2, 1000);
printf("ip2 inside main says %s\n", 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
的结果。有关详细信息,请参阅此问题:Do I cast the result of malloc?