不使用指针反向打印C字符串?

mie*_*emy 2 c string reverse

有没有办法在不使用指针的情况下反向打印固定大小的字符串?

#include<stdio.h>

main()
{
char buffer[10];

scanf("%s", buffer);

// need to print buffer in reverse without using pointers?? 

}
Run Code Online (Sandbox Code Playgroud)

sig*_*ine 8

可能是一个可爱的K&R功能,可以在打印之前就地翻转你的字符串?

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

void strrev(char *s) {
  int tmp, i, j;
  for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
    tmp = s[i];
    s[i] = s[j];
    s[j] = tmp;
  }
}

int main(int argc, const char *argv[]) {
  char buffer[10];
  scanf("%s", buffer);
  strrev(buffer);
  printf("%s\n", buffer);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)


Key*_*Key 7

#include<stdio.h>

main()
{
  char buffer[10];

  int n = scanf("%s", buffer);

  // print the number of chars written to buffer
  if (n != EOF) {
    int len = strlen(buffer);
    if (len <= 10) {
      int i;
      for (i = len - 1; i >= 0; i--)
        printf("%c", buffer[i]);  
    } 
  }
}
Run Code Online (Sandbox Code Playgroud)

  • -1表示没有任何注释的答案,并且没有考虑到读取的字符串可能短于9个字符的事实.如果你回答家庭作业类型的问题,请正确回答它们,以便OP至少有机会学习一些东西. (8认同)
  • @Key,但是但是OMG的`[]`是指针运算的语法糖!适当的答案可能应该是"你不能在没有指针的情况下用C做".顺便说一句,你错过了`缓冲区'中的第0个(第一个)字符.它应该是循环中的"i> = 0",而不是"i> 0". (3认同)
  • @Jens:或者错误地回答它们,以便OP学会(A)拥有它作为家庭作业或(B)拔出他们的教科书并阅读它. (2认同)

jkr*_*mer 5

因为[]只是指针的语法糖,这里的版本完全没有指针,数组或其他任何东西,只有一个int.你没有说必须以某种方式存储字符串.:)(注意我使用fgetc而不是缓冲区scanf).

[jkramer/sgi5k:.../c]# cat rev.c

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

void read_print();

int main(void) {
        fputs("Enter your string, yo! ", stdout);

        read_print();

        fputs("\nDone!\n", stdout);

        return EXIT_SUCCESS;
}

void read_print() {
        int c = fgetc(stdin);

        if(c != EOF && c != '\n') {
                read_print();
                fputc(c, stdout);
        }
}
[jkramer/sgi5k:.../c]# gcc -o rev rev.c -Wall -W -Os
[jkramer/sgi5k:.../c]# ./rev 
Enter your string, yo! foobar
raboof
Done!
Run Code Online (Sandbox Code Playgroud)