在删除 main 中的换行符后,我是否将 +1 添加到函数中的内存分配?
Do I add +1 to memory allocation in function after removing newline character in main?
如果我提示用户将文件名作为输入,然后检查并删除换行符,我是否仍然需要在分配内存 i 函数时将 +1
添加到 strlen(filename)
,因为使用了 strlen 和它计算没有最后一个字符的字符的事实?
或者因为我在 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 = '[=10=]';
}
}
wczytaj_macierz (filename, x, y);
这是否回答了您的问题:?
#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] = '[=10=]'; // Here lies \n
}
printf("%s %d\n", filename, strlen(filename));
}
// If filename was "file\n[=10=]", filename[strlen(filename) - 1] == '\n'
// Now with filename[strlen(filename) - 1] = '[=10=]'
// filename is "file[=10=][=10=]" that is "file[=10=]".
// strlen("file\n") == 5
// strlen("file") = 4
// strlen(filename) was 5 and now it is 4
return 0;
}
为字符串分配内存时,必须总是分配比字符串长度多一个字节。那个额外的字节用于终止 '[=12=]'
字符。
如果您有一个字符串恰好以换行符 \n
字符结尾,并且您将那个字符去掉,显然会使字符串缩短一个字符,这意味着您将需要少一个字节内存来存储它。但是存储它仍然需要 space 用于 [=14=]
,一如既往。
举个例子:
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 = '[=10=]'; // 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 = '[=11=]';
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
结尾,这意味着没有任何东西可以剥离,代码将停止正常工作。
如果我提示用户将文件名作为输入,然后检查并删除换行符,我是否仍然需要在分配内存 i 函数时将 +1
添加到 strlen(filename)
,因为使用了 strlen 和它计算没有最后一个字符的字符的事实?
或者因为我在 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 = '[=10=]';
}
}
wczytaj_macierz (filename, x, y);
这是否回答了您的问题:?
#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] = '[=10=]'; // Here lies \n
}
printf("%s %d\n", filename, strlen(filename));
}
// If filename was "file\n[=10=]", filename[strlen(filename) - 1] == '\n'
// Now with filename[strlen(filename) - 1] = '[=10=]'
// filename is "file[=10=][=10=]" that is "file[=10=]".
// strlen("file\n") == 5
// strlen("file") = 4
// strlen(filename) was 5 and now it is 4
return 0;
}
为字符串分配内存时,必须总是分配比字符串长度多一个字节。那个额外的字节用于终止 '[=12=]'
字符。
如果您有一个字符串恰好以换行符 \n
字符结尾,并且您将那个字符去掉,显然会使字符串缩短一个字符,这意味着您将需要少一个字节内存来存储它。但是存储它仍然需要 space 用于 [=14=]
,一如既往。
举个例子:
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 = '[=10=]'; // 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 = '[=11=]';
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
结尾,这意味着没有任何东西可以剥离,代码将停止正常工作。