C程序,反转数组

时间:2013-05-30 04:29:59

标签: c

我正在编写C程序,从标准输入读取一行字符输入。然后以相反的顺序输出字符行。

它不打印反转数组,而是打印常规数组。

任何人都可以帮助我吗? 我究竟做错了什么?

main()
{

    int count;
    int MAX_SIZE = 20;
    char c;
    char arr[MAX_SIZE];
    char revArr[MAX_SIZE];

    while(c != EOF)
    {
        count = 0; 
        c = getchar();
        arr[count++] = c;

        getReverse(revArr, arr);

        printf("%s", revArr);

        if (c == '\n')
        {
            printf("\n");
            count = 0; 
        }
    }
}


void getReverse(char dest[], char src[])
{


    int i, j, n = sizeof(src); 

    for (i = n - 1, j = 0; i >= 0; i--)
    {
        j = 0;
        dest[j] = src[i];
        j++;    
    }
}

6 个答案:

答案 0 :(得分:4)

你有很多问题。第一个是getReverse()main()中使用getReverse()时没有原型。您应该提供原型,或者只是将main()移到main()之上,以便c 知道

第二个事实是你在输入每个字符后试图反转字符串,并且你的输入法不太正确(它在获得一个字符之前检查一个不确定的count = 0; c = getchar(); while (c != EOF) { arr[count++] = c; c = getchar(); } arr[count] = '\0'; )。这样的事情会更好:

count = 0;
c = getchar();
while ((c != '\n') && (c != EOF)) {
    arr[count++] = c;
    c = getchar();
}
arr[count] = '\0';

这将为您提供一个正确的C字符串,尽管最后一行有换行符,甚至可能是多行字符串,它与您的规范不匹配(“从标准输入读取一行字符”) 。如果您想要新行文件结束来终止输入,您可以改为使用它:

c

最重要的是,int实际上应该是char,而不是EOF,因为它必须能够存储每个可能的字符 plus getReverse()标记。

你的sizeof函数也有问题,主要是因为它没有在数组末尾放置一个结束字符串标记,而且因为它使用了错误的大小(strlen而不是{ {1}})并且因为它似乎每次循环都重新初始化j。无论如何,它可以大大简化:

void getReverse (char *dest, char *src) {
    int i = strlen(src) - 1, j = 0;
    while (i >= 0) {
        dest[j] = src[i];
        j++;
        i--;
    }
    dest[j] = '\0';
}

或者,一旦你是一个熟练的编码员:

void getReverse (char *dest, char *src) {
    int i = strlen(src) - 1, j = 0;
    while (i >= 0)
        dest[j++] = src[i--];
    dest[j] = '\0';
}

如果您需要一个主程序,它为每行提供反转字符,您可以使用以下内容执行此操作:

int main (void) {
    int count;
    int MAX_SIZE = 20;
    int c;
    char arr[MAX_SIZE];
    char revArr[MAX_SIZE];

    c = getchar();
    count = 0;
    while(c != EOF) {
        if (c != '\n') {
            arr[count++] = c;
            c = getchar();
            continue;
        }
        arr[count] = '\0';
        getReverse(revArr, arr);
        printf("'%s' => '%s'\n", arr, revArr);
        count = 0;
        c = getchar();
    }

    return 0;
}

,在样本运行中显示:

pax> ./testprog
hello
'hello' => 'olleh'
goodbye
'goodbye' => 'eybdoog'
a man a plan a canal panama
'a man a plan a canal panama' => 'amanap lanac a nalp a nam a'

答案 1 :(得分:3)

每次while循环运行时,'count'变量都会变为0。

答案 2 :(得分:1)

  • 每次进入循环时,Count都会初始化为
  • 你正在发送带有每个角色的阵列以进行逆转,这不是一个非常明亮的事情,但不会产生问题。相反,首先将所有字符存储在数组中,并在数组完成后将其发送到getreverse函数。
  • sizeof(src)不会给出字符数。在循环作为参数终止后,你发送i怎么样?当然,有许多方法和各种功能,但由于你似乎处于初始阶段,你可以试试strlen和其他类似的功能。
  • 你已经在for循环中将j初始化为0但是再次指定它INSIDE循环将在每次从顶部运行时初始化值,因此j最终不会导致。所以从INSIDE循环中删除j = 0和i = 0,因为你只需要初始化一次。

答案 3 :(得分:0)

检查出来

#include <stdio.h>
#include <ctype.h>

void getReverse(char dest[], char src[], int count);

int main()
{
  // *always* initialize variables
  int count = 0;
  const int MaxLen = 20; // max length string, leave upper case names for MACROS
  const int MaxSize = MaxLen + 1; // add one for ending \0
  int c = '\0'; 
  char arr[MaxSize] = {0};  
  char revArr[MaxSize] = {0};

  // first collect characters to be reversed
  // note that input is buffered so user could enter more than MAX_SIZE
  do
  {
    c = fgetc(stdin);
    if ( c != EOF && (isalpha(c) || isdigit(c))) // only consider "proper" characters
    {
      arr[count++] = (char)c;
    }
  }
  while(c != EOF && c != '\n' && count < MaxLen); // EOF or Newline or MaxLen

  getReverse( revArr, arr, count );

  printf("%s\n", revArr);

  return 0;
}

void getReverse(char dest[], char src[], int count)
{
  int i = count - 1;
  int j = 0; 

  while ( i > -1 )
  {
    dest[j++] = src[i--];
  }
}

答案 4 :(得分:0)

处理字符串是C中错误的丰富来源,因为即使是复制和修改等简单操作也需要考虑分配和存储问题。通过将输入和输出视为字符串而不是字符的流,并依赖递归和本地存储来处理所有分配,可以大大简化这个问题。

以下是一个完整的程序,它将读取一行标准输入并将其反向打印到标准输出,输入的长度仅受堆栈增长的限制:

int florb (int c) { return c == '\n' ? c : putchar(florb(getchar())), c; }
main() { florb('-'); }

答案 5 :(得分:0)

..或查看此

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
char *my_rev(const char *source);

int main(void)
{
char *stringA;
stringA = malloc(MAX);    /* memory allocation for 100 characters */
if(stringA == NULL)        /* if malloc returns NULL error msg is printed and program exits */
    {
    fprintf(stdout, "Out of memory error\n");
    exit(1);
    }
else
    {    
    fprintf(stdout, "Type a string:\n");
    fgets(stringA, MAX, stdin);
    my_rev(stringA);
    }
return 0;
}
char *my_rev(const char *source)    /* const makes sure that function does not modify the value pointed to by source pointer */
{
int len = 0;                    /* first function calculates the length of the string */
while(*source != '\n')   /* fgets preserves terminating newline, that's why \n is used instead of \0 */  
    {
    len++;
    *source++;
    }
len--;                           /* length calculation includes newline, so length is subtracted by one */
*source--;                   /* pointer moved to point to last character instead of \n */
int b;
for(b = len; b >= 0; b--)    /* for loop prints string in reverse order */
    {
    fprintf(stdout, "%c", *source);        
    len--;
    *source--;
    }
return;
}  

Output looks like this:
Type a string:
writing about C programming
gnimmargorp C tuoba gnitirw