【问题标题】:I don't know how to print a sentence only under certain circumstances我不知道如何仅在某些情况下打印句子
【发布时间】:2018-10-07 16:29:15
【问题描述】:

我无法解决书中的问题。

问题是:

读取一个单词并向后输出字符串,并向后输出, 如果回文与原件相同,则应打印回文。

另外,不要使用诸如 string.h 之类的库,而应包括 stdio.h 仅限。

所以我创建了下面的代码。

#include <stdio.h>

int main()
{
    char str[128];
    char temp;
    int leng = 0;
    char a;

    scanf("%s", str);
    {
        a = str;
    }
    while(str[leng] != '\0')
        leng++;

    for (int i = 0; i < leng/2; i++)
    {
      temp = str[i];
      str[i] = str[leng - i - 1];
      str[leng - i - 1] = temp;
    }
    printf("%s\n", str);
    {
        if (a == str)
            printf("palindrome\n");
    }
    return 0;
}

倒序输出很容易解决,但我在打印回文的过程中阻塞了。我尝试只在输入和输出值相同的情况下打印回文。

但是,我使用的 if (a == str) 是用于比较地址值的代码。 另外,我认为将 strcmp 实现为循环会很有用,但我找不到使用 strcmp 将输入值与输出值进行比较的方法。

有没有办法比较C中的输入和输出值?或者有没有办法只在某些情况下(输入=输出)进行回文打印?

我想知道我是否可以在 C 中准确编码输入值 = 输出值。

注意,当地址值相同时,我的代码会打印回文。所以我还没有看到:(

【问题讨论】:

  • 您需要将“是回文”的测试与“打印反向字符串”分开。测试“回文”的一种方法是反向复制字符串,然后查看副本是否与原始字符串相同。另一种方法是比较第一个和最后一个字符 - 如果它们相同,那么从最后一个字符开始的第二个和第二个字符等等,直到你到达中间。然后您可以打印原件和反面(或打印两次原件,因为您现在知道它与反面相同)。

标签: c string loops if-statement


【解决方案1】:

这是一个编写松散的未经测试的代码,应该可以解决您的问题。

char str[128];

if( fgets( str, 128, stdin ) )
{
   /* I hate this but restriction on string.h 
      Calculate the size of this string */

   size_t s_len = 0;
   char *p = str;   
   for( ; *p && *p != '\n' ; p++ )
      s_len++;

   /* trim down nextLine characters */      
   if( p && *p == '\n' ) 
   {
      *p = '\0';
   }

   if( s_len == 0 )
   { 
        /* Should never be the case here */
        exit(0);
   }

   /* This should handle both cases of reversing and pallindrom */
   int isPallindrom = 1; /* Lets Say Yes for now*/
   for( size_t i = 0, j = s_len-1; i < j ; i ++, j -- )
   {
        if( str[i] != str[j] )
           isPallindrom = 0; // Not a pallindrom

        swap( str, i, j); // Write a swap function here
   } 

   /* at this point you should have 
      1. a reversed string in a
      2. based on isPallindrom value a confirmation if it really a pallindrom */
}

例如,您的代码中存在一些基本错误

 a = str; 

if (a == str)

在编译时打开警告,以便在执行前及时捕捉到这些。

编辑 - swap 给你。

void swap( char *s, size_t i, size_t j )
{ 
    char t = s[i];
       s[i] = s[j];
       s[j] = t;
}

【讨论】:

  • 哇,谢谢我已经将 j 初始化为 s_len 另一个错误?可能这里没问题
  • 是的 j 应该以 s_len -1 开头。我的扫描仪在上一个错误处停止了 .. ;) 此更改还需要测试 s_len &gt; 0
  • 这样说:让ij 也成为size_t
  • 还是看str 的角落案例,只带一个'\n'...代码做了一个s_len--; 太多了。虽然修剪......总是这样做,但角落案例很简单。
  • 我认为代码在修剪 '\n' 时不必要地减少了 s_len,这在上面的 for 循环中从未计入,因此 s_len- 在修剪逻辑中是不必要且容易出错的
【解决方案2】:

使用此功能:

int compare(char *str1, char *str2)
{
    while(*str1 && *str2){
        if(*str1 ==  *str2){
            str1++;
            str2++;
        }
        else return (*str2 - *str1);
    }
    if(*str1)
        return -1;
    if(*str2)
        return 1;
    return 0;
}

逻辑:

直到在其中一个字符串中遇到 '\0',检查任一字符串中的字符。如果字符相等,则继续。否则,返回 string1 > string2 中的字符的负数,如果 string1

一旦遇到 '\0',检查 string1 是否有更多字符。如果是,它是更大的字符串,因此返回一个负数。 如果 string1 没有更多字符,请检查 string2。如果它也没有更多字符,则返回 0。否则返回正数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2014-01-17
    • 2020-06-20
    • 2015-05-02
    • 2020-10-12
    相关资源
    最近更新 更多