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);
程序读取输入'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);