无法确定字符串末尾的字符值

时间:2013-10-15 06:11:11

标签: c string

我是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个字符。但是,我似乎无法弄清楚最后一个的身份。 “再见”从不打印。有谁知道这个神秘人物会是什么?

3 个答案:

答案 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)

假设

  1. c中的数组索引以0
  2. 开头
  3. strlen返回字符串的长度
  4. 所以,如果你有字符串"exit",这将是array = e, x, i, t, \0中的5个符号,strlen返回4,但是你试图将它减1,所以你要检查最后一个字符串中的符号,而不是NULL终结符

    检查NULL终止符使用command[strlen(command)] - 这将总是给你\0,所以没有任何意义

    如果您想比较字符串使用strcmp函数

    更新:您的计划出现问题是因为fgets在字符串末尾添加了\n符号:

      

    换行符使fgets停止读取,但它被认为是a   函数的有效字符并包含在复制到的字符串中   海峡

答案 2 :(得分:0)

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

访问它

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

进行测试