[问题]靠,这样也能通过

软件和网站开发以及相关技术探讨
wl1336412
帖子: 182
注册时间: 2006-05-27 14:58
来自: 西安

[问题]靠,这样也能通过

#1

帖子 wl1336412 » 2008-08-27 15:59

一哥们学C语言,这是他写的字符串反转:

代码: 全选

void strrev(char str[])

{
       int len = strlen(str);

       char tmp[len];                 //这里是重点,我敢保证此程序在gcc下被编译通过并正常执行了

       tmp[0] = '\0';                  //可能老的gcc会编译不通过,太神奇了。

       for (int i = len; i > 0; --i)

       {

        strncat(tmp, &str[i], 1);

       }

       strcpy(str, tmp);

}
没有深入研究,不过tmp[]数组没有存放在栈内。请高手指点一下
_________________
ekiga: 699716@egika.net
头像
majia
帖子: 649
注册时间: 2008-08-25 10:40

#2

帖子 majia » 2008-08-28 17:44

:cry: :cry:
灌水专用
头像
huangjiahua
帖子: 3294
注册时间: 2005-03-30 0:27
联系:

#3

帖子 huangjiahua » 2008-08-28 17:49

C99 标准的动态数组
跃过无数的时间断层,只为了在
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

#4

帖子 yaoms » 2008-08-28 17:49

for (int i = len; i > 0; --i)
这个 不符合 c99 标准。。
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
manphiz
帖子: 1
注册时间: 2007-06-26 20:53

#5

帖子 manphiz » 2008-08-28 23:54

yaoms 写了:
for (int i = len; i > 0; --i)
这个 不符合 c99 标准。。
符合的。
两者也都是 GNU 的扩展。gcc 默认使用 -std=gnu89 。
头像
zhan
帖子: 1880
注册时间: 2005-08-15 0:04
来自: 南7技校

#6

帖子 zhan » 2008-08-29 0:13

哇,C/C++专家糖糖mm惊现。。。
飞得高,飞得低,学习再学习,多少大秘密!
http://zhan.blog.ubuntu.org.cn
头像
Strange
帖子: 1824
注册时间: 2006-05-19 9:54
来自: Shanghai

#7

帖子 Strange » 2008-08-29 8:02

虽然是c99标准,但是gcc默认是打开动态数组功能的,所以一点问题都没有
ニンニク入れますか?
x60 with gentoo
wl1336412
帖子: 182
注册时间: 2006-05-27 14:58
来自: 西安

#8

帖子 wl1336412 » 2008-08-30 19:00

呵呵,学习了
_________________
ekiga: 699716@egika.net
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#9

帖子 BigSnake.NET » 2008-08-30 19:03

gcc 的扩展
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
CLOCKWORKHEART
帖子: 635
注册时间: 2007-11-05 19:26

#10

帖子 CLOCKWORKHEART » 2008-09-01 13:30

加上 -std=gnu99就能编译通过了,不过程序中有个小错误就是tmp少了个字节,反转后会把原字符串的首字符给丢了。
Everything that has a beginning has an end.
poet
帖子: 2841
注册时间: 2006-09-11 22:47

#11

帖子 poet » 2008-09-01 13:33

什么叫没有问题?

楼主这程序,能编译过,但是运行肯定有问题。因为为tmp分配的长度少了一个字节,导致后面会缺一个放'\0'字节的空间的。
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

#12

帖子 yaoms » 2008-09-01 13:33

manphiz 写了:
yaoms 写了:
for (int i = len; i > 0; --i)
这个 不符合 c99 标准。。
符合的。
两者也都是 GNU 的扩展。gcc 默认使用 -std=gnu89 。
但是我执行报这个:

代码: 全选

t.c: In function ‘main’:
t.c:3: error: ‘for’ loop initial declaration used outside C99 mode
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

#13

帖子 yaoms » 2008-09-01 13:34

yaoms 写了:
manphiz 写了:
yaoms 写了:
for (int i = len; i > 0; --i)
这个 不符合 c99 标准。。
符合的。
两者也都是 GNU 的扩展。gcc 默认使用 -std=gnu89 。
但是我执行报这个:

代码: 全选

t.c: In function ‘main’:
t.c:3: error: ‘for’ loop initial declaration used outside C99 mode
代码附上:

代码: 全选

#include <stdio.h>
int main(){
for (int i = 0 ; i<=3; i++)
{
	;
}
}
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
poet
帖子: 2841
注册时间: 2006-09-11 22:47

#14

帖子 poet » 2008-09-01 13:47

yaoms 写了:
manphiz 写了:
yaoms 写了:
for (int i = len; i > 0; --i)
这个 不符合 c99 标准。。
符合的。
两者也都是 GNU 的扩展。gcc 默认使用 -std=gnu89 。
但是我执行报这个:

代码: 全选

t.c: In function ‘main’:
t.c:3: error: ‘for’ loop initial declaration used outside C99 mode
你编译的时候肯定没带 C99参数: gcc -std=gnu99
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

#15

帖子 yaoms » 2008-09-01 13:48

manphiz 说 gcc 默认使用的阿,我还要带?那为什么叫做默认?

PS. 2007-06-26 注册,发了一个贴。好潜水员阿
附件
fvwm-135005.png
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
回复