strcmp返回值错误(初学者)

时间:2018-01-05 23:58:56

标签: c

#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. 比较字符串。
  4. 我在函数中有一个非常奇怪的问题,那就是strcmp返回值。出于某种原因,当两个字符串具有相同的字符(如ABBA)时,strcmp将返回其中一个字符串的值更大。我真的很想知道这是什么问题,我该如何解决它。

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

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

1 个答案:

答案 0 :(得分:4)

由于用户输入字符串中有\n(换行符)字符,因此出现问题。

  

fgets()

     

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

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

说,用户输入字符串是“ABBA”。因此,在输入输入后,userSentence的内容将为“ABBA \ n”。

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

倒车后,compareSentence的内容将为“\ nABBA”。

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

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

由于您是初学者,所以向您提出一个建议 - 不要忽略编译器警告('s)

声明 -

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

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

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

有更好的方法可以找出字符串是否是回文,但由于你是初学者,你的开始是好的。快乐学习.. :)