Can';t确定字符串末尾字符的值
我是C编程新手。我正试图做一个程序,需要一些简单的输入。然而,我发现,将我的输入字符串与用户输入的“意思”进行比较时,在末尾有一个额外的字符。我认为这可能是一个“\0”或“\r”,但情况似乎并非如此。这是我的代码片段:Can';t确定字符串末尾字符的值,c,string,C,String,我是C编程新手。我正试图做一个程序,需要一些简单的输入。然而,我发现,将我的输入字符串与用户输入的“意思”进行比较时,在末尾有一个额外的字符。我认为这可能是一个“\0”或“\r”,但情况似乎并非如此。这是我的代码片段: char* getUserInput(char* command, char $MYPATH[]) { printf("myshell$ "); fgets(command, 200, stdin); printf("%u\n", (unsigned)st
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个字符。然而,我似乎无法确定最后一个的身份。“再见”永远不会打印。有人知道这个神秘字符可能是什么吗?您没有看到最后一个字符的原因是
strlen()
不会将“\0”计算到字符串的长度中。因此对“\0”的测试不会成功。
例如,const char*a=“abc”代码>然后strlen(a)
将为3。如果要测试它,需要通过command[strlen(command)]
在“退出”时使strlen
等于5的原因是fgets
将在输入的末尾附加“\n”字符。您可以通过命令[strlen(command)-1]='\n'
来测试它
“exit”
,这将是数组中的5个符号=e,x,i,t,\0
,strlen返回4,但您试图将其递减1,所以您将检查字符串中的最后一个符号,而不是空终止符
要检查空终止符,请使用命令[strlen(command)]
-这将始终为您提供\0
,因此没有任何意义
如果要比较字符串,请使用函数
更新:您的程序出现问题是因为在字符串末尾附加了\n
符号:
换行符使FGET停止读取,但它被视为
函数指定的有效字符,并包含在复制到的字符串中
str
神奇的第五个元素很可能是一个换行符:
\n
来自(我强调):
fgets()从流中最多读入一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止如果读取换行符,则将其存储到缓冲区。将显示“\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]);
}
}
...
char*getUserInput(char*命令,char$MYPATH[])
{
printf(“myshell$”);
fgets(命令,200,标准输入);
printf(“%u\n”,(未签名)strlen(命令));
{
大小i=0,len=strlen(命令);
对于(;i
字符串中的最后一个字符(例如命令[strlen(command)-1]
)永远不会是'\0'
。另一方面,命令[strlen(command)]
将始终是'\0'
。顺便说一句,检查(命令[(未签名)strlen(command)]='\0')
的意义较小需要以nul结尾的字符串,如果没有\0
那么行为将是未定义的,如果有nul符号为什么要检查它..您正在测试'\r'
。但是在烹调终端模式下,enter键生成一个换行字符,'\n'
。请尝试测试该字符。$MYPATH
是有效的变量名吗?in函数参数为什么不直接打印此字符:printf(“神秘字符=%02x\n”,command[(未签名)strlen(command)-1]);
strlen返回5。代码显示输入时,输入5个字符,比如“exit”。关键是无法只输入“exit”。第五个字符将始终进入!@JanHudec yes“exit”
由五个字符组成,包括\0
,在C语言中字符str[4]=“exit”;
有效\0
未输入。特殊情况下!str
只包含4个charsIlya,而不是downvoter,但请记住fgets
在末尾放了一个额外的\n
,因此Jan是right@JanHudec这是因为fgets在末尾添加了\n
,但对于“exit”,strlen将返回4,对于“exit\n”将返回5+1以获得发布的唯一正确答案。有趣的是,在出现这一条后,每个人都会突然编辑关于斯特伦的答案:)以供参考:@ElchononEdelson:谢谢。我添加了答案的链接。