c/c++语言开发共享读取字符串并比较它C.

我试图创建一个基于C的字符串菜单,用户输入一个命令,然后运行一个代码块。

无论我做什么,条件永远不会成立:

char *input= ""; fgets(input, 50, stdin); printf("%s",input); printf("%d",strcmp( input,"arrive")); if(strcmp( input,"arrive")==0){.... 

我是相当新的c,我发现字符串真的很烦人。

我究竟做错了什么?

注意:当前代码崩溃了我的程序:(

    为什么strcmp总是返回非0:

    只有当字符串相同时, strcmp才会返回0。 至于为什么它总是评价不同。 这是因为fgets在null终止之前将换行符放在输入缓冲区的末尾。

     /*Will print 0 if you type in arrive*/ printf("%d",strcmp( input,"arriven")); 

    为什么你的程序崩溃:

    另一个问题是input应该是char缓冲区。 像这样: char input[1024]; 目前你有input作为指向空终止字符串的指针(这是只读内存)


    友情提示:

    也不要将null终止放在字符串文字中。 使用字符串文字时会自动隐含。 就strcmp而言,双重null终止并不重要,但它可能会在未来的程序中引起其他问题。 人们会想知道你为什么要做双无效终止。

    试试:

     #define BUFF_LEN 256 char input[BUFF_LEN]; fgets(input, BUFF_LEN, stdin); 

    你有什么, *input是指向尚未分配的内存地址的指针,因此程序无法使用。 使用它的结果是未定义的,但通常会导致segmentation fault 。 如果要将其作为指针访问,首先需要分配它:

     char *input = malloc(BUFF_LEN); 

    …当然,在完成使用后测试失败(NULL)然后free()它。

    编辑:

    至少根据单个UNIX规范 ,fgets()保证null终止缓冲区。 没有必要初始化输入[]。

    正如其他人所说,使用strcmp()时不必包含null /换行符。

    我也非常强烈地建议你现在习惯使用strncmp() ,同时开始避免许多问题。

    尝试用第一行替换

     char input[50]; memset(input, 0, sizeof(input)); 

    编辑:但是,为什么strcmp不返回0的真正问题是你必须“修剪”从fgets读取的字符串,在大多数情况下,它包括换行符。

      以上就是c/c++开发分享读取字符串并比较它C.相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/544929.html

      (0)
      上一篇 2021年1月9日
      下一篇 2021年1月9日

      精彩推荐