【问题标题】:Reading In A String and comparing it C读入一个字符串并比较它 C
【发布时间】:2010-04-05 00:19:18
【问题描述】:

我正在尝试创建一个基于 C 的字符串菜单,用户在其中输入命令,然后运行一段代码。

无论我做什么,条件都不是真的:

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

我对 c 还很陌生,发现字符串真的很烦人。

我做错了什么?

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

【问题讨论】:

  • 请考虑使用 strncmp() 而不是 strcmp(),这样可以省去很多麻烦。
  • 为什么 strcmp() 会引起头痛?
  • @TimPost strcmp() 工作得非常好,它完全符合它的预期 - 比较 2 个字符串,这在这种情况下似乎是合适的。 strncmp() 当然也可以很好地工作,但它并不能减轻头痛,而且它既不是更好也不是 strcmp() 的替代品

标签: c string


【解决方案1】:

为什么 strcmp 总是返回非 0:

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

/*Will print 0 if you type in arrive<enter>*/
printf("%d",strcmp( input,"arrive\n"));

程序崩溃的原因:

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


友情建议:

也不要将以空结尾的\0 放在字符串文字中。当您使用字符串文字时,它会自动隐含。就strcmp 而言,双重空终止并不重要,但它可能会在您未来的程序中的其他地方引起问题。人们会想知道你为什么要使用双空终止。

【讨论】:

    【解决方案2】:

    试试:

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

    您所拥有的,*input 是指向尚未分配的内存地址的指针,因此您的程序无法使用。按原样使用它的结果是未定义的,但通常会导致segmentation fault。如果你想以指针的形式访问它,你首先需要分配它:

    char *input = malloc(BUFF_LEN);
    

    ...当然,测试它是否失败(NULL),然后在你完成使用它之后释放它。

    编辑:

    至少根据single UNIX specification,fgets() 保证为空终止缓冲区。不需要初始化 input[]。

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

    我也强烈建议您现在习惯使用strncmp(),同时开始避免以后出现许多问题。

    【讨论】:

    • fgets 接收的计数包含空字符,因此不需要- 1
    • 您怀疑未来可能会出现哪些具体问题?见What's wrong with strcmp?
    【解决方案3】:

    尝试将第一行替换为

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

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

    【讨论】:

    • 或者只是 char input[50] = {0} 而不是浪费周期 memset()-ing 一切。
    • 为什么缓冲区的 memset 会被 fgets 覆盖?
    • 这只是防止 C 学习者陷入常见陷阱的约定。
    • @shinkou - 我最初也建议这样做,但是 fgets() 保证会终止缓冲区。然而,轻微的尼特。
    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2016-02-08
    • 2013-11-22
    相关资源
    最近更新 更多