Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t确定字符串末尾字符的值_C_String - Fatal编程技术网

Can';t确定字符串末尾字符的值

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

我是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个字符。然而,我似乎无法确定最后一个的身份。“再见”永远不会打印。有人知道这个神秘字符可能是什么吗?

您没有看到最后一个字符的原因是
strlen()
不会将“\0”计算到字符串的长度中。因此对“\0”的测试不会成功。 例如,
const char*a=“abc”然后
strlen(a)
将为3。如果要测试它,需要通过
command[strlen(command)]

在“退出”时使strlen
等于5的原因是
fgets
将在输入的末尾附加“\n”字符。您可以通过
命令[strlen(command)-1]='\n'

来测试它

  • c中的数组索引以0开头
  • strlen返回字符串的长度
  • 所以,如果您有字符串
    “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:谢谢。我添加了答案的链接。