在删除 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 结尾,这意味着没有任何东西可以剥离,代码将停止正常工作。