提问人:Shar'Dama Ka 提问时间:1/26/2021 最后编辑:Shar'Dama Ka 更新时间:1/27/2021 访问量:419
删除 main 中的换行符后,我是否会在函数中的内存分配中添加 +1?
Do I add +1 to memory allocation in function after removing newline character in main?
问:
如果我提示用户提供文件名作为输入,然后检查并删除换行符,在分配内存时我是否仍然需要添加换行符,因为使用 strlen 并且它计算没有最后一个字符的字符?+1
strlen(filename)
或者没有必要,因为我删除了它?main()
我读过不添加 +1 会为字符串分配很少的内存并导致问题,但我阅读了关于此事的矛盾内容,并希望得到一些澄清。
double** wczytaj_macierz (char* filename, int x, int y)
{
char *file = malloc(strlen(filename) + 1);
sprintf(file, "%s", filename);
FILE *fin = fopen (file, "r");
...
rest of the code
...
int main(void)
char filename[BUFSIZ];
{
printf("\nPlease enter filename, max %d characters.\n", sizeof(filename));
if (fgets(filename, sizeof(filename), stdin) != NULL)
{
if ((p = strchr(filename, '\n')) != NULL)
{
*p = '\0';
}
}
wczytaj_macierz (filename, x, y);
答:
0赞
Arthur Bacci
1/27/2021
#1
这回答了你的问题吗?
#include <stdio.h>
#include <string.h>
int main()
{
char filename[10];
printf("\nPlease enter filename, max %d characters.\n", sizeof(filename));
if (fgets(filename, sizeof(filename), stdin) != NULL)
{
printf("%s %d\n", filename, strlen(filename));
if (filename[strlen(filename) - 1] == '\n')
{
filename[strlen(filename) - 1] = '\0'; // Here lies \n
}
printf("%s %d\n", filename, strlen(filename));
}
// If filename was "file\n\0", filename[strlen(filename) - 1] == '\n'
// Now with filename[strlen(filename) - 1] = '\0'
// filename is "file\0\0" that is "file\0".
// strlen("file\n") == 5
// strlen("file") = 4
// strlen(filename) was 5 and now it is 4
return 0;
}
1赞
Steve Summit
1/27/2021
#2
为字符串分配内存时,必须始终分配比字符串长度多一个字节。该额外字节用于终止字符。'\0'
如果你有一个字符串碰巧以换行符结尾,并且你去掉了这个字符,你显然会使字符串缩短一个字符,这意味着你将需要更少的内存字节来存储它。但是,像往常一样,存储它仍然需要空间。\n
\0
举个例子:
char string[] = "test\n";
int stringlen = strlen(string); // length = 5
char *copy1 = malloc(stringlen + 1); // allocates 6 bytes
strcpy(copy1, string); // this works
char *p = strchr(string, '\n'); // find the \n
if(p != NULL) *p = '\0'; // strip it off
printf("string is now: \"%s\"\n", string);
stringlen = strlen(string); // length = 4
char *copy2 = malloc(stringlen + 1); // allocates 5 bytes
strcpy(copy2, string); // this works also
现在,如果你像这样编写代码:
char string[] = "test\n";
int stringlen = strlen(string);
char *p = strchr(string, '\n');
if(p != NULL) *p = '\0';
printf("string is now: \"%s\"\n", string);
char *copy = malloc(stringlen); // don't have to add 1,
// since I just stripped off \n
strcpy(copy, string);
看起来你可以不添加.但是,每当你必须添加注释来解释一些不存在的代码时,特别是如果你必须编写的注释比它替换的代码长,这通常表明你变得太聪明了,你应该把代码留在里面。而且,事实上,即使它一开始看起来可以工作,以这种方式编写代码也会非常危险,因为如果你最终得到一个不以 结尾的字符串,这意味着没有什么可以剥离的,代码将停止正常工作。+ 1
\n
评论
wczytaj_macierz
strlen
fgets
fopen (filename, "r");
const char*