字符倒叙输出的小代码 为什么输出不认识的字符

cprime 2010-01-30 04:48:58

#include <stdio.h>

#define MAX 100

//计算数组长度
int array_length(int a[]) {
int i;
for(i=0; i<MAX; i++) {
if(a[i] == '\0') {
return i;
}
}

}

int main(void){
int i,c;
int array[MAX];

for(i=0; i<MAX && (c=getchar()) != EOF; i++) { //EOF LINUX 是按 ctrl+d windows 好像是按 ctrl+z 不记得了
array[i] = c;
}

for(i=array_length(array); i>=0; i--) {
printf("%c",array[i]);
}

printf("\n");
}

这是执行代码后的输出:
sniffer@sniffer-desktop:~/myfile/c$ ./a
amdinistrator (回车) //ctrl+d 结束输入
4� //这里的看不懂的是怎么来的?????
rotartsinidma

...全文
209 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
toborac 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 cprime 的回复:]
C/C++ code#include<stdio.h>#define MAX 100int array_length(int a[]) {int i;for(i=0; i<MAX; i++) {if(a[i]=='\0'&& a[i]=='\n') {return i;
}
}return MAX-1;

}
[/Quote]
你这个怎么能对呢?a[i]能同时=='\0' && =='\n'吗?也许我眼花想错了。
cprime 2010-02-03
  • 打赏
  • 举报
回复
#include <stdio.h>

#define MAX 100

int array_length(int a[]) {
int i;
for(i=0; i<MAX; i++) {
if(a[i] == '\0' && a[i] == '\n') {
return i;
}
}
return MAX - 1;

}

int main(void){
int i,c,temp;
int array[MAX];

for(i=0; i<MAX-1 && (c=getchar()) != EOF; i++) {
array[i] = c;
}
array[i] == '\0';

temp = array_length(array);

for(i=temp; i>=0; i--) {
printf("%c",array[i]);
}

printf("\n");
}


后一个代码贴错了,这个是后来写的,这个是对的
cprime 2010-02-03
  • 打赏
  • 举报
回复
求数组长度的代码:

#include <stdio.h>

#define MAX 1000

int main(void) {
int i, c, length, array[MAX];

int array_length(int a[]);

for(i=0; i<MAX && (c = getchar()) != EOF; i++)
array[i] = c;

array[i] = '\0';

printf("%d\n",array_length(array));

}

int array_length(int a[]) {
int i;

for(i=0; i<MAX; i++) {
if(a[i] == '\0')
return i;
else continue;
}

return MAX;
}


我题目要实现的代码:

#include <stdio.h>

#define MAX 100

int array_length(int a[]) {
int i;
for(i=0; i<MAX; i++) {
if(a[i] == '\0' && a[i] == '\n') {
return i;
}
}
return MAX - 1;

}

int main(void){
int i,c,temp;
int array[MAX];

for(i=0; i<MAX-1 && (c=getchar()) != EOF; i++) {
array[i] = c;
}
array[i] == '\0';

temp = array_length(array);

for(i=temp; i>=0; i--) {
printf("%c",array[i]);
}

printf("\n");
}



mstlq 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yzx714 的回复:]

C/C++ code
#include <stdio.h>int main(int argc,int*argv[])
{return (argc=getchar())!='\n'? (main(0,NULL),putchar(argc)) :0;
}

这个写法不错,我怎么就没想到main函数呢!
[/Quote]

这个写法相当不好>_<
因为不好读,而且执行效率也不高……

只能用来在新手面前装B……
yzx714 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mstlq 的回复:]
引用 14 楼 lcl_data 的回复:
引用 13 楼 mstlq 的回复:
更短的写法也有……
C/C++ code
#include <stdio.h>int main()
{char ch;if((ch=getchar())!='\n')
        main();
    putchar(ch);return0;
}

牛X的代码。。
可读性很差


这个写法,我已经考虑到可读性了>_ <
如果要专注把可读性写差点,作为恶心风格的示范的话,我会这样写……
C/C++ code
#include<stdio.h>int main(int argc,int*argv[])
{return (argc=getchar())!='\n'? (main(0,NULL),putchar(argc)) :0;
}
[/Quote]
这个写法不错,我怎么就没想到main函数呢!
十八道胡同 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mstlq 的回复:]

#include<stdio.h>int main(int argc,int*argv[])
{return (argc=getchar())!='\n'? (main(0,NULL),putchar(argc)) :0;
}
[/Quote]
呵呵,代码不错。
mstlq 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lcl_data 的回复:]
引用 13 楼 mstlq 的回复:
更短的写法也有……
C/C++ code
#include <stdio.h>int main()
{char ch;if((ch=getchar())!='\n')
        main();
    putchar(ch);return0;
}

牛X的代码。。
可读性很差
[/Quote]

这个写法,我已经考虑到可读性了>_<
如果要专注把可读性写差点,作为恶心风格的示范的话,我会这样写……

#include <stdio.h>
int main(int argc,int *argv[])
{
return (argc=getchar())!='\n' ? (main(0,NULL),putchar(argc)) :0;
}
十八道胡同 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mstlq 的回复:]
更短的写法也有……
C/C++ code
#include<stdio.h>int main()
{char ch;if((ch=getchar())!='\n')
main();
putchar(ch);return0;
}
[/Quote]
牛X的代码。。
可读性很差
mstlq 2010-01-30
  • 打赏
  • 举报
回复
更短的写法也有……

#include <stdio.h>
int main()
{
char ch;
if((ch=getchar())!='\n')
main();
putchar(ch);
return 0;
}
mstlq 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yzx714 的回复:]
总觉得您们怎么都写那么长?
C/C++ code#include<string.h>
#include<stdio.h>#define MAX_LEN 256int main()
{char line[MAX_LEN];
fgets(line,MAX_LEN,stdin);char* p=line;while(*p++!='\0')
;while(p--!=line)
putchar(*p);
putchar('\n');return0;
}
我这个短是短点(呸,什么话呢)应该还可以工作吧~
[/Quote]

短也不是不可以……

#include <stdio.h>
#define MAX_LEN 256
void show(char *p)
{
if((*p=getchar())!='\n')
show(p+1);
putchar (*p);
}
int main()
{
char line[MAX_LEN];
show(line);
putchar('\n');
return 0;
}
cattycat 2010-01-30
  • 打赏
  • 举报
回复
你的数组还是定义成char比较好。另外,你的长度多了一个,大家都说的很对。
cocat 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 toborac 的回复:]
4楼回答不错,我来给楼主解释一下原因。
首先是3楼改的那个,输入后的array最后加个'\0',要不你的array_length怎么判断结尾呢。
另外4楼很小心地把你的MAX都改成了MAX-1,因为你的array index是从0到MAX-1的
至于你原来出错,是因为当你调用array_length时,因为没有放'\0',结果返回长度是MAX,于是printf整个array的内容。而你的array又是局部变量,编译器把它分配在堆栈内,而堆栈内来来去去的都是些返回地址临时变量什么的,一般不一定为0并且很多值是大于0x7F即不可显示型,而这些不可显示型又被借用来表示一些特殊字符或者特殊语言,(如GB2312双字节吗汉字啊好像是0xA0A0记不清了)于是就出现你的结果。
你说的那个唯一的正确其实也不对,中间不还是多了一个空行。
[/Quote]
说得很详细噢~
yzx714 2010-01-30
  • 打赏
  • 举报
回复
总觉得您们怎么都写那么长?
#include <string.h>
#include <stdio.h>
#define MAX_LEN 256
int main()
{
char line[MAX_LEN];
fgets(line,MAX_LEN,stdin);
char* p=line;
while(*p++!='\0')
;
while(p--!=line)
putchar(*p);
putchar('\n');
return 0;
}

我这个短是短点(呸,什么话呢)应该还可以工作吧~
z569362161 2010-01-30
  • 打赏
  • 举报
回复
#include <stdio.h>
#define MAX 100
int array_length(int a[])
{
for(int i=0; i<MAX; i++)
if(a[i] == '\0')
return i;
return MAX-1;/*mark*/
}

int main(void)
{
int i,c;
int array[MAX];
for(i=0; i<MAX-1 && (c=getchar()) != EOF; i++)
array[i] = c;
array[i]='\0';
for(i=array_length(array); i>=0; i--)
printf("%c",array[i]);
printf("\n");
return 0;
}
十八道胡同 2010-01-30
  • 打赏
  • 举报
回复
for(i=array_length(array); i>=0; i--) {
printf("%c",array[i]);
}

这里array_length的函数的期望结果是数组的长度,而你
int array_length(int a[]) {
int i;
for(i=0; i<MAX; i++) {
if(a[i] == '\0') {
return i;
}
}

}

并不是得到数组的长度。
修改为

int array_length(int a[]) {
int i;
for(i=0; i<MAX; i++) {
if(a[i] == '\0') {
return i;
}
}
return MAX-1;
}

toborac 2010-01-30
  • 打赏
  • 举报
回复
4楼回答不错,我来给楼主解释一下原因。
首先是3楼改的那个,输入后的array最后加个'\0',要不你的array_length怎么判断结尾呢。
另外4楼很小心地把你的MAX都改成了MAX-1,因为你的array index是从0到MAX-1的
至于你原来出错,是因为当你调用array_length时,因为没有放'\0',结果返回长度是MAX,于是printf整个array的内容。而你的array又是局部变量,编译器把它分配在堆栈内,而堆栈内来来去去的都是些返回地址临时变量什么的,一般不一定为0并且很多值是大于0x7F即不可显示型,而这些不可显示型又被借用来表示一些特殊字符或者特殊语言,(如GB2312双字节吗汉字啊好像是0xA0A0记不清了)于是就出现你的结果。
你说的那个唯一的正确其实也不对,中间不还是多了一个空行。
cocat 2010-01-30
  • 打赏
  • 举报
回复

int array_length(int a[]) {
int i;
for(i=0; i<MAX; i++) {
if(a[i] == '\0') {
return i;
}
}
return MAX-1;//没加的画会出现 warning C4715: 'array_length' : not all control paths return a value
}

至于一堆不懂得什么字就是没有设定数组的结尾'\0'
mstlq 2010-01-30
  • 打赏
  • 举报
回复

#include <stdio.h>

#define MAX 100

int array_length(int a[]) {
int i;
for(i=0; i<MAX; i++) {
if(a[i] == '\0') {
return i;
}
}
return MAX-1;/*mark*/
}

int main(void){
int i,c;
int array[MAX];

for(i=0; i<MAX-1 && (c=getchar()) != EOF; i++) {/*mark*/
array[i] = c;
}
array[i]='\0';/*mark*/

for(i=array_length(array); i>=0; i--) {
printf("%c",array[i]);
}

printf("\n");
return 0;
}
cprime 2010-01-30
  • 打赏
  • 举报
回复
#include <stdio.h>

#define MAX 100

int array_length(int a[]) {
int i;
for(i=0; i<MAX; i++) {
if(a[i] == '\0') {
return i;
}
}

}

int main(void){
int i,c;
int array[MAX];

for(i=0; i<MAX && (c=getchar()) != EOF; i++) {
array[i] = c;
}

for(i=array_length(array); i>=0; i--) {
printf("%c",array[i]);
}

printf("\n");
}


重发一下代码 希望阅读的人舒服些
cprime 2010-01-30
  • 打赏
  • 举报
回复
sniffer@sniffer-desktop:~/myfile/c$ ./a
gigi i love you! do you love me

em evol uoy od !uoy evol i igig //这里出现了奇迹 测试了这么多就这个是希望输出的结果
sniffer@sniffer-desktop:~/myfile/c$ ./a
gigi i love you ! do you love me
���TH@
em evol uoy od ! uoy evol i igig
sniffer@sniffer-desktop:~/myfile/c$ ./a
i love you
4��
uoy evol i
sniffer@sniffer-desktop:~/myfile/c$ ./a
how are you!
4��
!uoy era woh
sniffer@sniffer-desktop:~/myfile/c$
加载更多回复(1)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧