【发布时间】:2015-02-05 00:51:08
【问题描述】:
我查看了网站上的其他类似问题,但我仍然没有看到我缺少什么。 C 对我来说是一个新的和可怕的野兽,所以我确信它很简单,但是当代码到达 while 循环内的 fgets(); 行时,我遇到了分段错误(核心转储)。
我尝试直接将字符串写入currentInput,但仍然得到它,所以我认为我以某种方式访问了错误的字符串?
我的理解是分段错误是由访问(程序?)无权访问的内存引起的......
顺便说一句,有没有办法在 strcmp(); 中使用字符串文字?所以我可以与“END”进行比较?
void runCommands()
{
char * currentInput = (char*)malloc(100); //100 char input buffer
char * cmd = (char*) malloc(CMD_LENGTH);
char * target = (char*) malloc(UID_LENGTH);
char * key = (char*) malloc(KEY_LENGTH);
char * endstr = "END";
cmd = "UNDEF";
target = "UNDEF";
key = "UNDEF";
ushort tokens;
while (strcmp(cmd, endstr) != 0) //Run until command is "END"
{
printf("ENTER INSTRUCTION: ");
fgets(currentInput, sizeof(currentInput), stdin); //FAULT OCCURS HERE
tokens = sscanf(currentInput, "%[^,\n],%[^,\n],%s", cmd, target, key); //parse string for values
if (tokens <= 3 && tokens >= 1) //ensure valid # of tokens passed
{
fprintf(stdout, "TOKENS:\nCMD: %s\ntarget: %s\nkey: %s\n", cmd, target, key);
switch (tokens)
//restore UNDEF for non-existent tokens
{
case 1:
target = "UNDEF";
/* no break */
case 2: //intentional fallthrough
key = "UNDEF";
break;
default:
break;
}
/* handle commands */
if (strcmp(cmd, endstr) == 0)
{
end(keyfile);
} //write file and exit function
else if (strcmp(cmd, "DELETE") == 0)
{
delete(target, key);
} //delete specified key from UID
else if (strcmp(cmd, "VALIDATE") == 0)
{
validate(target, key);
} //valid/not valid based on key presence
else if (strcmp(cmd, "ADD") == 0)
{
add(target, key);
} //add key to target UID
else if (strcmp(cmd, "PRINT") == 0)
{
print(target);
} //print sorted keys for UID or all keys for ALL
else
{
invalidCMD(cmd);
} //error message for invalid command
}
else
{
invalidCMD(currentInput); //use whole input as bad command if invalid format
}
}
free(currentInput);
free(target);
free(key);
free(cmd);
}
【问题讨论】:
-
“旁白”:是的,你可以写
strcmp(cmd, "END") -
您错误地使用了
sizeof -
发布一个显示问题的完整程序,see here 发布指南
-
另外,如果这些数组仅供本地使用,我怀疑,不要
malloc()他们就像你在做Java一样。只需char currentInput[100];。
标签: c segmentation-fault