c编程结构指针的动态分配

c programming dynamic allocation of struct pointers

程序读取输入'1z'为(str+0)->input_name,'2y'为(str+1)->input_name,'3x'为( str+2)->input_name.现在我想做的是在不删除初始元素的情况下向 (str+0)->input_name 插入一个新字符串。所以初始的 (str+0)->input_name 会变成 (str+1)->input_name, (str+1)->input_name 变成 (str+2)->input_name,并且 (str+2)->input_name 变为 (str+3)->input_name。我该怎么做??

初始化项目

产品数量:3

输入姓名:1z

输入姓名:2y

输入姓名:3x

输出

1 -> 1z

2 -> 2y

3 -> 3x

=====================

输入:4a

输出

1 -> 4a

2 -> 2y

3 -> 3x

4 -> 你好

我想做的是:

输出

1 -> 4a

2 -> 1z

3 -> 2 岁

4 -> 3x

我该怎么办?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 1000

struct input{
  char input_name[SIZE];
};

int main(){    
  int i, startNum;
  struct input *str;
  char _startNum[SIZE];
  char _mode[SIZE];

  fputs("****Choose Menu****\n", stderr);    
  fputs("\n**Initialize items**\nNumber of products: ", stderr);
  fgets(_startNum, SIZE, stdin);
  startNum = atoi(_startNum);

  str = (struct input*)malloc(startNum * sizeof(struct input));
  if (str == NULL){
    printf("Memory allocation error\n");
    exit(EXIT_FAILURE);
  }

  for(i = 0; i < startNum; i++){
    printf("Enter name: ");
    fgets((str+i)->input_name, sizeof(struct input), stdin);
  }
  printf("\n");


  fputs("\n**Output**\n", stderr);  
  for(i = 0; i < startNum; i++){
    printf("%d -> %s", i+1, (str+i)->input_name);
  }
  printf("\n");

  startNum++;

  strcpy((str+startNum-1)->input_name, "Hello");
  for(i = startNum - 1; i = 0; i--){
    strcpy((str+i)->input_name,(str+i-1)->input_name);
  }

  fputs("Input: ", stderr); 
  fgets((str+0)->input_name, SIZE, stdin);

  fputs("\n**Output**\n", stderr);  
  for(i = 0; i < startNum; i++){
    printf("%d -> %s", i+1, (str+i)->input_name);
  }
  fputs("\n", stderr);

  return EXIT_SUCCESS;
}

如果我没理解错,那么你需要以下内容

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 1000

struct input{
  char input_name[SIZE];
};

int main( void )
{    
  int i, startNum;
  struct input *str;
  char _startNum[SIZE];
  char _mode[SIZE];

  fputs("****Choose Menu****\n", stderr);    
  fputs("\n**Initialize items**\nNumber of products: ", stderr);
  fgets(_startNum, SIZE, stdin);
  startNum = atoi(_startNum);

  str = (struct input*)malloc(startNum * sizeof(struct input));
  if (str == NULL){
    printf("Memory allocation error\n");
    exit(EXIT_FAILURE);
  }

  for(i = 0; i < startNum; i++){
    printf("Enter name: ");
    fgets((str+i)->input_name, SIZE, stdin);
  }
  printf("\n");


  fputs("\n**Output**\n", stderr);  
  for(i = 0; i < startNum; i++){
    printf("%d -> %s", i+1, (str+i)->input_name);
  }
  printf("\n");

  startNum++;


  struct input tmp =  realloc(str, startNum * sizeof(struct input));
  if (tmp == NULL){
    printf("Memory reallocation error\n");
    exit(EXIT_FAILURE);
  }

  str = tmp;

  strcpy((str+startNum-1)->input_name, "Hello");
  for(i = startNum - 1; i != 0; i--){
    strcpy((str+i)->input_name,(str+i-1)->input_name);
  }

  fputs("Input: ", stderr); 
  fgets((str+0)->input_name, SIZE, stdin);

  fputs("\n**Output**\n", stderr);  
  for(i = 0; i < startNum; i++){
    printf("%d -> %s", i+1, (str+i)->input_name);
  }
  fputs("\n", stderr);

  free( str );

  return EXIT_SUCCESS;
}

至于您的代码,它具有未定义的行为,因为没有为附加元素分配内存。

而且这个循环中有错别字

for(i = startNum - 1; i = 0; i--){
                      ^^^^^

使用赋值代替比较。

也代替这个调用

fgets((str+i)->input_name, sizeof(struct input), stdin);

一般你必须使用

fgets((str+i)->input_name, sizeof((str+i)->input_name), stdin);

fgets((str+i)->input_name, SIZE, stdin);