回文计划

时间:2012-02-02 02:21:21

标签: c

我创建了一个程序,它接受一个输入的字符串并向后输出字符串。我创建了一个计算字符串中字符数的函数。有了这些信息,我创建了另一个函数,将原始数组的第一个字符放在新数组的末尾。因此,当函数中的循环完成时,新数组包含原始数组的字母但向后。然而,我遇到了一些困难。我仍然对字符数组保持警惕,我不确定我是否正确使用它们。有人可以帮助我吗?

#include <stdio.h>

#define MAXLINE 1000

char backward(char str[], int count)
int count(char str[])

int main() {
    char orig[MAXLINE];
    int c;

    scanf("%s", orig);
    c = count(orig);
    printf("%s", backward(orig, c));

    return 0;
}

char backward(char str[], int count) {
    char back[MAXLINE];
    int i;

    for(i = 0; i <= count; ++i) {
        back[count] = str[i];
        --count;

    return back;
}

int count(char str[]) {
    int i;

    for (i = 0; str[i] != '\0'; ++i)
        ;

    return i;
}

编辑:输入:让我们说“小型货车”。预期的产出将是“navinim”。还没有实际的输出。我收到了这个错误:

palindrome.c:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’

6 个答案:

答案 0 :(得分:5)

你得到的错误是因为你的原型错了:

#include <stdio.h>

#define MAXLINE 1000

char backward(char str[], int count)  /* missing ; */
int count(char str[])                 /* missing ; */

int main() {

您还应该考虑将count()替换为strlen(3)头文件中的<string.h>。标准库中充满了已经调试并且已知可以正常工作的实用程序 - 值得使用它们。 (是的,重新实施它们具有教育价值。但在这种情况下,请准备好用各种角落案例进行测试。)

答案 1 :(得分:2)

您的代码可能无法编译,因为您错过了backward()中的右括号。

char backward(char str[], int count) {
    char back[MAXLINE];
    int i;

    for(i = 0; i <= count; ++i) {
        back[count] = str[i];
        --count;
    /** You should add a } character here! **/

    return back;
}

MAJOR EDIT 1:

我试图编译你的代码,但它有很多问题。这是工作代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLINE 1000

char * backward(char * str);

int main() {
  char orig[MAXLINE];
  int c;

  scanf("%s", orig);
  printf("%s\n", backward(orig));

  return 0;
}

char * backward(char * str) {
  int count = strlen(str);
  char * back = malloc(MAXLINE);
  int i;
  for(i = 0; i < count; i++)
  {
    back[count-i-1] = str[i];
  }
  back[count] = 0; // Add the null termination character.
  return back;
}

当我运行此代码并输入“abcde”时,它会输出“edcba”。如果您对此如何运作有任何具体问题,请与我们联系。我删除了count()函数,因为它与strlen()重复,我将调用移到了strlen()内的backward(),以建立{{1}的接口功能更简单。

使你的代码失败的另一件事是你在for循环中递减backward(),这会导致你的for循环比你想要的更早终止。

答案 2 :(得分:1)

此行有一个错误:

back[count] = str[i];

count不是字符串的最后一个字符,而是'\0'字符。

您还要返回一个堆栈变量 - 这不会起作用。

你应该反转字符串:

for(i = 0; i <= count; ++i) {
    --count;
    char tmp = str[i];
    str[i] = str[count];
    str[count] = tmp;
}

然后您可以返回str

答案 3 :(得分:0)

你的程序有很多错误。首先,在向后声明原始数据并计数时,你错过了分号(;)。然后你还没有用后面的大括号(})关闭向后函数中的for循环。 但最大的三个问题是 1.您已将向后函数定义为char数据类型,但是您将返回指向char数据类型数组的指针 2.您正在访问[count]而不是返回[count-1]。假设字符串是小型货车。计数将保持7.最后一个字符位于第6个位置而不是第7个因为在数组下标中从0开始而不是1.并且返回[count]将指向空字符,即'\ 0' 3.您正在递增i并递减计数并检查i&lt; = count。这将只处理你的字符串直到它的中间。

尽管David Greyson发布了正确的程序,但由于他已经删除了count函数并引入了strlen和malloc函数,我只是通过纠正算法再次发布程序

#include <stdio.h>

#define MAXLINE 1000

char *backward(char str[], int count);
int count(char str[]);

int main() {
    char orig[MAXLINE];
    int c;

    scanf("%s", orig);
    c = count(orig);
    printf("%s", backward(orig, c));

    return 0;
}

char *backward(char str[], int count) {
    char back[MAXLINE];
    int i;

    for(i = 0; i < count; ++i) {
        back[count-i-1] = str[i];
    }
    back[i] = '\0';
    return back;
}

int count(char str[]) {
    int i;

    for (i = 0; str[i] != '\0'; ++i)
        ;

    return i;
}

答案 4 :(得分:0)

您可以创建一个字符指针,然后将字符串的长度添加到此指针,它应该char *reverse = (char *)name,然后添加reverse = reverse + strlen(name) -1

然后你可以通过字符串的开头使用while循环。整个代码看起来,

void main(void)
{
    char *name = "Kernel";
    char *reverse = (char *)name;
    reverse = reverse + strlen(name) - 1;
    while(*reverse)
        printf("%c", *reverse);
}

答案 5 :(得分:0)

#include<Stdio.h>
#include<string.h>
int main()
{ 
 size_t i,j;
 char arr[10]={'\0'};//orignal array
 char arr2[10]={'\0'};//it's reverse to be
 gets(arr);//prompt
 strncpy(arr2,arr,10);//copy
 strrev(arr2);
 if(strncmp(arr,arr2)==0)
    printf("plaindrom");
return 0;
}