我是C编程的新手。我正在尝试制作一个需要一些简单输入的程序。但是我发现,在将输入字符串与用户“意味着”输入的内容进行比较时,最后会有一个额外的字符。我认为这可能是'\ 0'或'\ r',但似乎并非如此。这是我的代码片段:
char* getUserInput(char* command, char $MYPATH[])
{
printf("myshell$ ");
fgets(command, 200, stdin);
printf("%u\n", (unsigned)strlen(command));
if ((command[(unsigned)strlen(command) - 1] == '\0') || (command[(unsigned)strlen(command) - 1] == '\r'))
{
printf("bye\n");
}
return command;
}
代码显示输入时,说“退出”输入5个字符。但是,我似乎无法弄清楚最后一个的身份。 “再见”从不打印。有谁知道这个神秘人物会是什么?
答案 0 :(得分:9)
神奇的第五元素很可能是换行符:\n
来自man fgets()
(我强调):
fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。读数在EOF或换行符后停止。 如果读取换行符,则会将其存储到缓冲区中。 A' \ 0'是 存储后缓冲区中的最后一个字符。
通过这样做来证明打印出的每个字符:
char* getUserInput(char* command, char $MYPATH[])
{
printf("myshell$ ");
fgets(command, 200, stdin);
printf("%u\n", (unsigned)strlen(command));
{
size_t i = 0, len = strlen(command);
for (;i < len; ++i)
{
fprintf(stderr, "command[%zu]='%c' (%hhd or 0x%hhx)\n", i, command[i], command[i], command[i]);
}
}
...
答案 1 :(得分:2)
假设
答案 2 :(得分:0)
您没有看到最后一个字符的原因是因为strlen()
不会将'\ 0'计算为字符串的长度。所以测试'\ 0'不会成功。
例如,const char* a = "abc";
然后strlen(a)
将是3.如果您想测试它,则需要通过command[strlen(command)]
在“退出”时将strlen
等于5的原因是因为fgets
会在输入的末尾附加'\ n'字符。您可以按command[strlen(command) -1 ] == '\n'