簡體   English   中英

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

[英]Printing a C string in reverse without using pointers?

有沒有辦法在不使用指針的情況下反向打印固定大小的字符串?

#include<stdio.h>

main()
{
char buffer[10];

scanf("%s", buffer);

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

}

可能是一個可愛的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;
}
#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]);  
    } 
  }
}

因為[]只是指針的語法糖,所以這是一個完全沒有指針,數組或其他任何東西的版本,只有一個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!

這是一種遞歸的方式; 從技術上講,這是使用指針,但我不會用這么簡單的任務進入語言 - 律師模式。

#include <stdio.h>
/* If you want it printed forward, or backward, or think of another way.. */
typedef enum {
    FRONT = 1,
    BACK,
} direction;

/* Technically still using a pointer...don't nitpick. */
void echo_string(char buffer[], size_t buflen, direction from)
{
    /* An index into the buffer to echo, which will preserve
     * its value across subsequent recursive calls.
     */
    static size_t index = 0;
    /* According to the specified direction, print from the front
     * or the back of the buffer. Advance the index (a misnomer, I guess).
     */
    if(from == FRONT) {
        printf("%c", buffer[index++]);
    }
    else {
        printf("%c", buffer[buflen - ++index]);
    }
    /* Are there any more characters to echo? Yes? Awesome! */
    if(index != buflen) {
        echo_string(buffer, buflen, from);
    }
}

int main(int argc, char **argv)
{
    char buffer[10];
    scanf("%s", buffer);
    /* Better strlen() than sizeof() here,
     * but BEWARE! scanf() is DANGEROUS!
     */
    echo_string(buffer, strlen(buffer), BACK);
    return(0);
}

正如caf指出的那樣,我們仍在使用指針..!

這是解決問題的另一種方法(反轉字符串)。 此代碼段(可能還有大多數其他代碼)不尊重utf8之類的內容。 我認為發表K&R方式的帖子非常接近我的(:D)所以我讓我適應那個例子(並糾正了一些事情......)

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

void strrev(char *s) {

 size_t len = strlen(s) + 1;
 size_t i, j;

 for(i = 0; i < len / 2; i++) {

  j = len-1 - i-1;

  char tmp = s[j];
  s[j] = s[i];
  s[i] = tmp;

 }

}

int main(int argc, const char *argv[]) {
 char buffer[10];

 scanf("%s", buffer); // Look out for an overflow ;)
 strrev(buffer);
 puts(buffer);

 return(0);
}
 reverse(char c[], int len)
 {
       if( ! (len / 2))
          return;
       char t =  c[0];   
       c[0] = c[len--];  
       c[len] = t;
       reverse(c, len-1);
 }

錯誤留給學生作為練習。

您可以使用strrev來反轉字符串。

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

main()
{
    char buffer[10];

    scanf("%s", buffer);

    strrev(buffer);
    printf("%s", buffer);
}
void outstrreverse(const char s[])
{
    size_t l=strlen(s);
    while( l && s!=&s[--l] )
        putchar(s[l]);
    if(s[0])
        putchar(s[0]);
}

由於C字符串,數組和指針之間的關系,練習是相當蠢的恕我直言 - C中“字符串”的最慣用的描述由char *表示,它不是數組。 您的(OP)標題和帖子在字符串和字符[固定長度]之間的定義不同。

OP應該閱讀並理解這個FAQ條目 ,以及它與帖子之間的關系:輕松找出解決方案 - 並在必要時為教師/法官辯護。

我將對此發表評論:永遠不要使用scanf(“%s”,緩沖區)來填充固定長度的字符串。 如果必須使用scanf()來執行此操作,請使用字段寬度說明符:例如scanf(“%9s”,buffer); 如果緩沖區是[10],你需要一個9的說明符,因為scanf填充緩沖區:否則你必須小心龍! 您還可以逐個字符掃描並使用循環邊界來回避問題,但這可能效率較低。

#include <stdio.h>
#include <conio.h>

void reverse(char a[], int s, int sc );

void reverse(char a[], int s, int sc ){

if ((sc-s)<(s-1))
{
a[sc-s]^=a[s-1];
a[s-1]^=a[sc-s];
a[sc-s]^=a[s-1];
reverse (a, s-1, sc) ;

}

}

void main (){


char a[]="ABCDEFG";

reverse(a, 7, 7);
printf("%d",a);
getch(); //i just use it to freeze the screen

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM