main.c(包含所有标题,如stdio,stdlib等):
int main()
{
int input;
while(1)
{
printf("\n");
printf("\n1. Add new node");
printf("\n2. Delete existing node");
printf("\n3. Print all data");
printf("\n4. Exit");
printf("Enter your option -> ");
scanf("%d", &input);
string key = "";
string tempKey = "";
string tempValue = "";
Node newNode;
Node temp;
switch (input) {
case 1:
printf("\nEnter a key: ");
scanf("%s", tempKey);
printf("\nEnter a value: ");
scanf("%s", tempValue); //execution ternimates here
newNode.key = tempKey;
newNode.value = tempValue;
AddNode(newNode);
break;
case 2:
printf("\nEnter the key of the node: ");
scanf("%s", key);
temp = GetNode(key);
DeleteNode(temp);
break;
case 3:
printf("\n");
PrintAllNodes();
break;
case 4:
exit(0);
break;
default:
printf("\nWrong option chosen!\n");
break;
}
}
return 0;
}
storage.h定义:
#ifndef DATABASEIO_H_
#define DATABASEIO_H_
//typedefs
typedef char *string;
/*
* main struct with key, value,
* and pointer to next struct
* Also typedefs Node and NodePtr
*/
typedef struct Node {
string key;
string value;
struct Node *next;
} Node, *NodePtr;
//Function Prototypes
void AddNode(Node node);
void DeleteNode(Node node);
Node GetNode(string key);
void PrintAllNodes();
#endif /* DATABASEIO_H_ */
我正在使用Eclipse CDT,当我输入1时,我输入一个键。然后控制台说。我使用gdb并得到了这个错误:
Program received signal SIGSEGV, Segmentation fault.
0x00177024 in _IO_vfscanf () from /lib/tls/i686/cmov/libc.so.6
任何想法为什么?
答案 0 :(得分:5)
你应该为你的字符串分配足够的内存(typedef char * string)来读取scanf()
答案 1 :(得分:3)
//Change the value here to change the size of Ur strings (char-arrays actually)
#define MAX_LENGTH 20
char key[MAX_LENGTH];
char tempKey[MAX_LENGTH];
char tempValue[MAX_LENGTH];
您可能还想查看我在这里的gdb上的一个小演练:
古德纳克!!
CVS @ 2600Hertz
答案 2 :(得分:2)
在调用之前,您必须分配scanf()
将要使用的所有存储空间; scanf()
不分配存储空间。你的字符串是空的;为值分配的存储空间最小。输入任何额外数据都是一场灾难。
另外,scanf()需要一个字符指针,而不是字符串引用或值 - 因为它是一个可变参数函数,编译器只能发出有限的警告。
答案 3 :(得分:0)
嗯,你确定scanf可以使用提供的字符串来存储数据吗?
我尝试使用足够大的char缓冲区或切换到真正的C ++函数来读取输入。