不同的数据类型:如何将它们全部存储在一个字符串中以及如何为其分配动态内存?

时间:2018-11-07 11:42:47

标签: c string malloc

as T

大家好,我是编程的新手,我正在尝试找出如何在分配所需内存的同时将所有变量保存到一个字符串中。 培训任务是学习如何使用snprintf函数。 “ const size_t内存;”也被给了,但是我不知道该在哪里使用。

希望你们能帮我,问候!

3 个答案:

答案 0 :(得分:1)

除了没有分配足够的内存外,您还混淆了size_t的用途-它用于存储事物的大小,而不是用于存储内存。因此,您想将要分配的内存量存储在memory中。并将malloc的结果存储在string中。

所以你想要这样的东西。多余的8个用于输出中的空格和其他字符以及NUL终止字符。

memory = strlen(dayofweek)+strlen(month)+intlen(day)+intlen(year)+8;
string = malloc(memory);

或者如果您不写自己intlen

memory = strlen(dayofweek)+strlen(month)+14;

答案 1 :(得分:1)

  

如何将它们全部存储在一个字符串中以及如何为其分配动态内存?

致电snprintf()两次。首先确定内存需求。 @Kamil Cuk

  

snprintf函数返回将要写入的字符数   n足够大,不计入终止空字符,如果发生编码错误,则不计负值。 C11§7.21.6.53

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  char dayofweek[] = "Friday";
  int day = 13;
  char month[] = "May";
  int year = 1927; 

  int len = snprintf(NULL, 0, "%s der %d.%s %d\n", dayofweek, day, month, year);
  size_t memory = len + 1u;
  char *string = malloc(memory);
  len = snprintf(string, memory, "%s der %d.%s %d\n", dayofweek, day, month, year);

  printf("<%s>\n", string);

  free(string);
  return 0;
}

pedantic代码将添加检查以确保len >= 0(2个地方)以及分配是否成功。

答案 2 :(得分:0)

据我所知,C没有intlen()函数,至少在包含项目的头文件中没有。 strlen()返回字符串的长度,但对于其他字符串,您必须自行确定char所需的空间量。除了要使用指针,还需要指定一个内存块。否则,您不能使用像您的char * string定义那样的指针。为说明自己,我附加了两段代码,请检查

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int intlen(int data4_allocate) {
 return floor(log10(abs(data4_allocate))) + 1;
}
int main() {

    char dayofweek[] = "Friday";
    int day = 13;
    char month[] = "May";
    int year = 1927;
    char *string; //I want to save my date into this string
    const size_t *memory;
    //trying to allocate memory
    memory = (size_t*)malloc(strlen(dayofweek) + strlen(month) + intlen(day) + 
    intlen(year));
    string = (char*)malloc(sizeof(memory)+1);
    //trying to write my strings and ints into one string
    snprintf(string, (size_t)memory, "%s der %d.%s %d\n", dayofweek, day, month, 
    year);

    printf("%s\n", string);

   free((char*)string);
   return 0;
}

或者您可以定义一个宏,该宏确定给定数字的最大字节长度,在这种情况下,您的代码可能类似于以下代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main() {
    #define MONTH_BYTE_SIZE 2 // 0 -- 12  max 2 char needed 
    #define DAY_BYTE_SIZE 2 // 0-31 max 2 char needed
    #define YEAR_BYTE_SIZE 4 // 0--2999 max 4 char needed 

    char dayofweek[] = "Friday";
    int day = 13;
    char month[] = "May";
    int year = 1927;
    char *string; //I want to save my date into this string
    const size_t *memory;

   //trying to allocate memory
   memory = (size_t*)malloc(strlen(dayofweek) + (sizeof(char)*MONTH_BYTE_SIZE) + 
   (sizeof(char) * DAY_BYTE_SIZE) + (sizeof(char) * YEAR_BYTE_SIZE));
   string = (char*)malloc(sizeof(memory)+1);
   //trying to write my strings and ints into one string
   snprintf(string, (size_t)memory, "%s der %d.%s %d\n", dayofweek, day, month, 
   year);
   printf("%s\n", string);
   free((char*)string);
   return 0;

}

结果应类似于

this