1

我正在编写 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++;    
    }
}
4

6 回答 6

4

你那里有很多问题。首先是getReverse()当你在main(). 您应该提供一个原型或只是移动getReverse()到上面main()以便main() 了解它。

第二个事实是您在输入每个字符后都试图反转字符串,并且您的输入法不太正确(它c在获取字符之前检查不确定)。像这样会更好:

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

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

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

而且,最重要的是,c实际上应该是a ,而int不是 a char,因为它必须能够存储每个可能的字符和标记EOF

您的getReverse()函数也有问题,主要是因为它没有在数组末尾放置一个结束字符串标记,还因为它使用了错误的大小(sizeof而不是),并且因为它似乎每次通过循环都strlen重新初始化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'
于 2013-05-30T04:34:09.370 回答
3

每次 while 循环运行时,您的“计数”变量都会变为 0。

于 2013-05-30T04:36:29.617 回答
1
  • 每次进入循环时计数初始化为 0
  • 您正在发送带有每个字符的数组以进行反转,这不是一件很聪明的事情,但不会产生问题。相反,首先将所有字符存储在数组中,并在数组完成后将其发送一次到 getreverse 函数。
  • sizeof(src) 不会给出字符数。在 main 中终止循环后,您也将 i 作为参数发送怎么样。当然有很多方法和各种功能,但由于您似乎处于初始阶段,您可以尝试 strlen 和其他此类功能。
  • 您已经在 for 循环中将 j 初始化为 0,但是再次在循环内部指定它会在每次从顶部运行时初始化该值,因此 j 最终不会增加。因此,请从 INSIDE 循环中删除 j=0 和 i=0,因为您只需要将其初始化一次。
于 2013-05-30T05:22:25.937 回答
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

于 2015-02-07T13:35:28.133 回答
0

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

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

int florb (int c) { return c == '\n' ? c : putchar(florb(getchar())), c; }
main() { florb('-'); }
于 2013-05-30T05:38:26.550 回答
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--];
  }
}
于 2013-05-30T05:30:32.847 回答