林做一個非常簡單的TodoList的在C.如何通過價值添加字符串,而不是引用
我的附加功能需要一個char *
作爲參數。當我將它添加到我的char **
提醒列表中時,它會添加緩衝區的內存地址而不是字符串的值。
當我運行下面給定的源時,問題就變得很明顯。
如果您嘗試[dd]一個字符串,比如說「Test」,然後發出命令[p] rint,則會打印一個「p」。
我明白,這是因爲我的list[0]
持有一個指向我的緩存,這樣,當緩衝的值發生變化,所以確實在我的列表中的值。
我的C是生鏽的,我知道strcpy()
可能會解決這個問題?但這是處理這個問題的常用方法嗎?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int size = 0;
int capacity = 50;
char **list;
void initList() {
list = malloc(capacity * sizeof(char *));
for (int i = 0; i < capacity; i++) {
list[i] = malloc(256 * sizeof(char));
}
}
void saveReminders() {
}
void add(char *reminder) {
list[size++] = reminder;
}
void delete(int index) {
}
void print() {
for (int i = 0; i < size; i++)
printf("%s\n", list[i]);
}
void quit() {
saveReminders();
exit(0);
}
void readReminders() {
}
void helpMenu() {
printf("Enter a command:\n");
printf("[a]dd a reminder\n");
printf("[d]elete a reminder\n");
printf("[p]rint all reminders\n");
printf("[q]uit\n");
}
void menu() {
helpMenu();
while (1) {
char buffer[64];
int index = 0;
printf("> ");
scanf("%s", buffer);
if (strcmp(buffer, "a") == 0) {
printf("Enter a reminder:\n> ");
scanf("%s", buffer);
add(buffer);
helpMenu();
}else if (strcmp(buffer, "d") == 0) {
printf("Remove which index?\n> ");
scanf("%d", &index);
delete(index);
helpMenu();
}else if (strcmp(buffer, "p") == 0) {
print();
helpMenu();
}else if (strcmp(buffer, "q") == 0) {
quit();
}
}
}
int main(int argc, char* argv[]) {
initList();
menu();
}
你會想複製字符串;) – SBI