【问题标题】:C Output formatting issuesC 输出格式问题
【发布时间】:2012-10-22 12:55:02
【问题描述】:

我的 C 输出格式存在一些问题。 请参阅下图了解我的输出

我希望我的输出如下

输入单词:KayaK

皮划艇是回文。

    // palindrome.c
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #define MAXLEN 20

    int isPalindrome(char [], int);

    int main(void) {
    char word[MAXLEN+1];
    int size;

    printf("Enter word: ");
    fgets(word,MAXLEN+1,stdin);
    size = strlen(word);
    if (isPalindrome(word, size-1)) //size - 1 because strlen includes \0
   {
    printf("%s is a palindrome.\n",word);
   }
   else
   {
    printf("%s is not a palindrome.\n",word);
   }
   return 0;
   }

 int isPalindrome(char str[], int size) {
int i;
for (i = 0; i < size; i++)
{
    if (tolower(str[i]) != tolower(str[size - i - 1]))
    {
        return 0;
    }
}
return 1;
}

【问题讨论】:

    标签: c formatting output


    【解决方案1】:

    fgets 读取字符串,包括终止换行符。在进一步处理之前将其剥离。

    请注意,您实际上在传递size-1 时考虑了这一点,但原因是错误的。它包括\n,而不是\0

    【讨论】:

    • 您好,感谢您的及时回复。我是 C 的新手。剥离它是什么意思?
    • word[strlen(word)-1]=0; 之类的东西应该可以。不过,您应该检查它是否不是零长度。
    【解决方案2】:

    您的代码掩盖了原始字符串包含行尾标记的问题:

    这一行去掉了尾随的零

    if (isPalindrome(word, size-1)) //size - 1 because strlen includes \0
    

    评论有误,顺便说一句:strlen不包括\0,它包括\n

    这一行忽略了尾随的\n,因为size - i - 1 又减去了1,即使你在第一次调用函数时已经减去了它:

    if (tolower(str[i]) != tolower(str[size - i - 1]))
    

    你应该这样做:

    size--;
    word[size] = '\0';
    if (isPalindrome(word, size-1)) //size - 1 because strlen includes \0
    

    现在您可以按如下方式更正您的回文检查器:

    if (tolower(str[i]) != tolower(str[size - i])) // No "minus one"
    {
        return 0;
    }
    

    【讨论】:

    • 嗯...你说的那行砍掉了尾随的零,实际上,考虑到\n,它减小了大小。但是你说的那一行忽略了尾随 \n 正在考虑 \0 (尽管实际上 \n 考虑到了(事实上 str[size] 指向超出实际字符串,无论是终止符)。
    • 而且最后的代码sn-p是错误的。 size-0(没有“减一”)点超出单词。
    • @MichaelKrelin-hacker 不,它没有,因为size 传递的值已从包含\n 的原始长度减少了两次(一次是--,另一个是size-1 将值传递给函数时)。
    • 是的,有两个错误可以相互补偿。考虑字符串aba,它读作aba\n,你传递的大小将是2。这显然具有误导性。
    【解决方案3】:

    剥离它意味着从字符串中删除它。

    //...
    printf("Enter word: ");
    fgets(word,MAXLEN+1,stdin);
    size = strlen(word);
    word[size-1] = '\0'
    //program
    

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2011-07-29
      相关资源
      最近更新 更多