C 我不知道';I don’我不知道只有在某些情况下才能打印一个句子

C 我不知道';I don’我不知道只有在某些情况下才能打印一个句子,c,string,loops,if-statement,C,String,Loops,If Statement,我无法解决书中的一个问题 问题是: 读一个单词并向后输出字符串,然后向后输出, 如果回文与原件相同,则应打印回文 另外,不要使用诸如string.h之类的库,而是包括stdio.h 只是 所以我创建了下面的代码 #include <stdio.h> int main() { char str[128]; char temp; int leng = 0; char a; scanf("%s", str); { a =

我无法解决书中的一个问题

问题是:

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

另外,不要使用诸如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;
}
#包括
int main()
{
char-str[128];
焦炭温度;
int leng=0;
字符a;
scanf(“%s”,str);
{
a=str;
}
while(str[leng]!='\0')
冷++;
对于(int i=0;i
按相反顺序输出很容易解决,但我在打印回文的过程中受阻。我试图只在输入和输出值​​都是一样的

然而,我使用的if(a==str)是一个比较地址值的代码。 另外,我认为将strcmp实现为一个循环会很有用,但是我找不到一种方法来使用strcmp比较输入值和输出值

有没有办法比较输入值和输出值​​在C中?还是只有在特定情况下(输入=输出),才可以进行回文打印

我想知道我是否能准确地用C来编码输入值=输出值

注意,当地址值为​​都是一样的。所以我还没有看到:(

使用这个函数:

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。如果string2也没有更多的字符,请返回0。否则返回正数。

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

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 */
}
编译时打开警告,以便在执行之前捕获这些警告

编辑-为您交换

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

您需要将“is palindrome”和“print reversed string”的测试分开。测试“palindrome”的一种方法是反向复制字符串,然后查看副本是否与原始字符串相同。另一种方法是比较第一个字符和最后一个字符-如果相同,则比较最后一个字符的第二个和第二个字符,然后你可以打印原稿和反面(或者打印原稿两次,因为你现在知道原稿和反面是一样的).Woww谢谢我将j初始化为s_len,这是另一个错误?可能没关系。是的
j
应该以
s_len-1开头。我的扫描仪在上一个错误时停止了…)此更改还需要测试
s_len>0
。这样说:Make
i
j
be
size\u t
。还是看看
str
的角盒,它只带了一个
'\n'
。。。代码执行一个
s_len--太多了。修剪时。。。通常都是这样,但拐角处的情况很简单。我认为代码在修剪'\n'时不必要地减少了s_len,这在上面的循环中从未计算过,所以修剪逻辑中的s_len是不必要的,并且容易出错
void swap( char *s, size_t i, size_t j )
{ 
    char t = s[i];
       s[i] = s[j];
       s[j] = t;
}