我猜这是一个类型问题,所以也许你可以告诉我它是如何正确完成的。
我正在阅读stdin
的命令输入,我想在用户输入q
时退出。
我正在使用stdin
将fgets()
的用户输入读入指向字符数组的指针。然后我使用strtok()
拼接掉第一个单词并将其指定给另一个指向字符数组的指针。然后我将它与q
进行比较,以查看用户是否想要使用strcmp()
函数退出程序。
以下是一些代码:
char *input = (char*)malloc(32 * sizeof(char));
char *command = (char*)malloc(8 * sizeof(char));
while (strcmp(command, "q") != 0)
{
memset(input, 0, sizeof(input));
printf("Enter command: ");
fgets(input, 64, stdin);
command = strtok(input, " ");
//if I enter q --> printf("%d", strcmp(command, "q")) == 10
//if I enter w --> printf("%d", strcmp(command, "q")) == 6
}
我想要的是,如果command == q
然后printf("%d", strcmp(command, "q"))
应该等于0
,则应该打印任何其他整数。
我还应该注意,我已经验证command
已正确分配。换句话说,当我输入q
,command == "q"
。
答案 0 :(得分:0)
也许你可以试试这段代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *input = (char*)malloc(32 * sizeof(char));
char *command = (char*)malloc(8 * sizeof(char));
while (strcmp(command, "q") != 0)
{
memset(input, 0, sizeof(input));
printf("Enter command: ");
fgets(input, 64, stdin);
command = strtok(input, " \n"); // Line corrected.
//if I enter q --> printf("%d", strcmp(command, "q")) == 10
//if I enter w --> printf("%d", strcmp(command, "q")) == 6
}
return 0;
}
答案 1 :(得分:0)
这里有几个问题。
此处分配的内存
char *command = (char*)malloc(8 * sizeof(char));
泄漏了这一行
command = strtok(input, " ");
获取执行作为唯一引用分配的内存被覆盖并因此丢失。
此处可能发生缓冲区溢出
fgets(input, 64, stdin);
允许读取更多字节(64)ito input
,因为它指的是这里完成的分配
char *input = (char*)malloc(32 * sizeof(char));
假设用户输入的数据不包含类似&#39; [空白] q ... then
命令get assigned
此命令的空白
command = strtok(input, " ");
这导致将NULL
传递给strcmp()
,以便在此处测试下一次迭代
while (strcmp(command, "q") != 0)
这样做会调用未定义的行为。
代码错过了检查相关函数调用的结果,例如malloc()`` and
fgets()`。
投放malloc()
&amp;的结果C中不需要朋友,也不建议使用。所以就是不要这样做。它可能很好地隐藏错误。
sizeof (char)
定义为1
。无需使用它。
请勿使用&#34; Magic Numbers&#34; /&#34; Tokens&#34;例如32
,8
,64
,"q"
......
如果您想要至少执行一次某个动作,那么在概念上使用while循环是错误的方法。在这种情况下,请使用do-while循环。
修复所有这些可能会导致以下代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define INPUT_BUFFER_SIZE (64)
#define QUIT_STRING "q"
int main(void)
{
int result = EXIT_SUCCESS; /* Be optimistic. */
char *input = malloc(INPUT_BUFFER_SIZE * sizeof *input);
if (NULL == input)
{
perror("malloc () failed");
result = EXIT_FAILURE;
}
else
{
char *command;
do
{
printf("Enter command:\n");
if (NULL == fgets(input, INPUT_BUFFER_SIZE, stdin))
{
if (!feof(stdin))
{
result = EXIT_FAILURE;
fprintf(stderr, "fgets() failed.\n");
}
break;
}
command = strtok(input, " \n");
} while ((command == NULL) || strcmp(command, QUIT_STRING) != 0);
if (NULL != command)
{
printf("User quit.\n");
}
free(input);
}
return result;
}