【问题标题】:strcmp return value is wrong (beginner) [duplicate]strcmp返回值错误(初学者)[重复]
【发布时间】:2018-01-05 23:58:55
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void getSentence(char userSentence[]);
int breakSentence_andCompare(char userSentence[] , char compareSentence[]);

#define MAX_SENTENCE 100

int main()
{
    int len = 0;
    char userSentence[MAX_SENTENCE] = {'o','k',0};
    char compareSentence[MAX_SENTENCE] = {'o',0};
    getSentence(userSentence);
    len = breakSentence_andCompare(userSentence,compareSentence);
}

/*
This function is asking the user to input info.
    input:user input string array - char userSentence[].
        output:none.
*/
void getSentence(char userSentence[])
{
    printf("Hello And Welcome To The Palindrome Cheker Made By xXTH3 SKIRT CH4S3RXx");
    printf("\nPlease Enter A Sentence: ");
    fgets(userSentence,MAX_SENTENCE,stdin);
}

/*
This function takes the input of the user and input it into another string backwards.
    input:user input string array - char userSentence[], backward user input string array - char compareSentence[].
        output:strcmp value.
*/
int breakSentence_andCompare(char userSentence[] , char compareSentence[])
{
    int i = 0;
    int z = 0;
    int len = 0;
    int cmp = 0;
    len = strlen(userSentence);
    len -= 1;
    for (i = len ; i >= 0 ; i--)
    {
        compareSentence[z] = userSentence[i];
        printf("%s",compareSentence);   
        z++;    
    }
    printf("\nuser: %s! compare: %s!",userSentence,compareSentence);
    cmp = strcmp(userSentence,compareSentence);
    printf("\n%d",&cmp);
    return cmp;
}

这个程序检查输入的字符串是否是回文, 简单解释一下它是如何工作的:

  1. 它需要用户输入 - 字符串。
  2. 它采用用户字符串,输入在另一个字符串中向后。
  3. 它比较字符串。

我在函数中有一个非常奇怪的问题,那就是strcmp 返回值。出于某种原因,当两个字符串具有相同的字符(如 ABBA)时,strcmp 将返回其中一个的值更大。我真的很想知道问题出在哪里以及如何解决。

附言 当我搜索问题时,我认为它可能与用户输入字符串可能包含来自回车键的\n 的事实有关;这可能吗?

请理解这不是完整的代码。代码缺少输出部分。

【问题讨论】:

  • strcmp 不会返回错误值,但 printf("\n%d",&amp;cmp); 会。请将其更改为printf("%d\n", cmp); 注意我还将换行符从开头移到结尾,类似于在书面英语中使用句号(句点)的方式。
  • printf("\n%d",&amp;cmp); 行打印的是cmp 的地址,而不是它的值。 (你的编译器可能应该警告过你。)
  • 可能想用userSentence[strcspn(userSentence, "\n")] = '\0';fgets(userSentence,MAX_SENTENCE,stdin);中删除潜在的尾随'\n'
  • 请注意,您的标题中不必包含“初学者”。看到标题“strcmp 返回错误值”的每个人都知道两件事:1)发帖人是初学者,2)strcmp 工作正常。
  • 说到 strcmp 工作得很好,我已经编程了 20 多年,并且发现我越快认为问题出在我身上,我就越早找到解决方案。暗示一个公共图书馆肯定会转移你的注意力并劝阻潜在的助手,但几乎可以肯定是错误的。

标签: c


【解决方案1】:

由于用户输入字符串中的尾随 \n(换行符)字符而出现问题。

fgets()

fgets() 函数应该从流中读取字节到数组中 由 s 指向,直到 n-1 个字节被读取,或 a 被读取 并转移到s,或遇到文件结束条件。 然后字符串以空字节终止。 [强调我的]

因此,换行符使fgets 停止读取,但函数将其视为有效字符并包含在输入字符串中。

比如说,用户输入的字符串是“ABBA”。所以,输入后userSentence的内容将是“ABBA\n”。

在您的程序中,您正在反转输入字符串并将其与原始输入字符串进行比较。

反转后compareSentence的内容为“\nABBA”。

两个字符串的内容不相同,strcmp() 将返回非零值作为比较结果。

有多种方法可以从 fgets() 输入中删除尾随 \n(换行符)字符。检查this

由于您是初学者,所以给您一个建议 - 不要忽略编译器 warning('s)

对于声明-

printf("\n%d",&cmp);

您必须在编译程序期间收到警告消息。

您应该尝试找出警告消息的原因并解决它们。

有很多更好的方法可以确定一个字符串是否是回文,但由于你是初学者,所以你的开始是好的。快乐学习.. :)

【讨论】:

  • H.S,非常感谢,除了最后没有新行之外,我没有收到任何编译警告/错误。(我使用的是 GCC 编译器)
  • @SaKaMoToSaN15: 使用 gcc 选项 -Wall 和 gcc 应该在声明中给出警告 - printf("\n%d",&amp;cmp);
  • 好的,谢谢,我尝试删除 \n 但效果不佳,我尝试使用: for (j = 0; j
  • @SaKaMoToSaN15:你可以简单地做 - userSentence[strlen(userSentence)-1] = '\0';。还有其他方法可以删除尾随换行符,请查看我在答案中提供的链接。
  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
相关资源
最近更新 更多