[英]Printing a C string in reverse without using pointers?
Is there a way to print a string of fixed size in reverse without using pointers? 有没有办法在不使用指针的情况下反向打印固定大小的字符串?
#include<stdio.h>
main()
{
char buffer[10];
scanf("%s", buffer);
// need to print buffer in reverse without using pointers??
}
A lovely K&R function to reverse your string in-place before printing it, perhaps? 可能是一个可爱的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]);
}
}
}
Since []
is just syntactic sugar for pointers, here's a version that works completely without pointers, arrays or anything else, just one single int
. 因为
[]
只是指针的语法糖,所以这是一个完全没有指针,数组或其他任何东西的版本,只有一个int
。 You didn't say that the string has to be stored somehow. 你没有说必须以某种方式存储字符串。 :) (Note that I use
fgetc
instead of a buffer and scanf
). :)(注意我使用
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!
Here's a recursive way of doing it; 这是一种递归的方式; technically, this is using a pointer, but I wouldn't go into language-lawyer mode with such simple tasks.
从技术上讲,这是使用指针,但我不会用这么简单的任务进入语言 - 律师模式。
#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);
}
As caf pointed out, we're still using pointers..! 正如caf指出的那样,我们仍在使用指针..!
Here's an other way to solve the problem (of reversing a string). 这是解决问题的另一种方法(反转字符串)。 This code snippet (and probably most others) don't respect stuff like utf8.
此代码段(可能还有大多数其他代码)不尊重utf8之类的内容。 I think signines post demonstrating the K&R way was quite close to mine (:D) so I adapted mine to fit that example (and corrected some things..)
我认为发表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);
}
The error(s) is left as an exercise to the student. 错误留给学生作为练习。
You can use strrev
to reverse a string. 您可以使用
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]);
}
Because of the relationship between C strings, arrays, and pointers the exercise is rather shotty IMHO - the most idiomatic description of a "String" in C is represented by the char*, which is not an array. 由于C字符串,数组和指针之间的关系,练习是相当蠢的恕我直言 - C中“字符串”的最惯用的描述由char *表示,它不是数组。 Your (the OPs) title and post differ in their definitions between string and char[fixed length].
您的(OP)标题和帖子在字符串和字符[固定长度]之间的定义不同。
The OP should read and understand this FAQ entry , and between that and the posts here: easily figure out a solution—as well as defend it to the teacher/judge if need be. OP应该阅读并理解这个FAQ条目 ,以及它与帖子之间的关系:轻松找出解决方案 - 并在必要时为教师/法官辩护。
I'll comment on this: never use scanf("%s", buffer) to populate a fixed length string. 我将对此发表评论:永远不要使用scanf(“%s”,缓冲区)来填充固定长度的字符串。 If you must use scanf() to do it, please use a field width specifier: eg scanf("%9s", buffer);
如果必须使用scanf()来执行此操作,请使用字段宽度说明符:例如scanf(“%9s”,buffer); if buffer is an [10], you want a specifier of 9 because of how scanf fills the buffer: otherwise you must beware the dragons!
如果缓冲区是[10],你需要一个9的说明符,因为scanf填充缓冲区:否则你必须小心龙! You could also scanf by character and evade the issue with a loops bounds, but that would likely be less efficient.
您还可以逐个字符扫描并使用循环边界来回避问题,但这可能效率较低。
#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.