user-0 提问: 简单C语言问题

回复:
user: user-0
content: 引用 60 楼 hadues 的回复:正好我看C primer plus正好看到strlen（）这个函数在string.h头文件不是stdio.h头文件[/quote] 那为什么 #include <string.h> void main() {                   char s[]  = "abc";                   printf("数组的长度为：%d\n", strlen(s)); } 可以正常运行呢？[/quote]VC中也可以这么干，不知道为什么

user: user-1
content: 是你的strlen函数字符结尾判断条件的问题。

user: user-2
content: $ cat a.c # include <stdio.h>  int mystrlen(char s[]) // 标准库里有个strlen，为了避嫌，换个名字 {     int n;     for (n = 0; *s != '\0'; s++) {         n++;         printf("%d ", n); // 每数一个字符，都把当前字符总数打印一次     }     return n; }  int main() {     char s[] = "abc";     printf("数组的长度为：%d\n", mystrlen(s));     return 0; }  $ ./a  1 2 3 数组的长度为：3

user: user-3
content: [/quote]正好我看C primer plus正好看到strlen（）这个函数在string.h头文件不是stdio.h头文件[/quote] 那为什么 #include <string.h> void main() {                   char s[]  = "abc";                   printf("数组的长度为：%d\n", strlen(s)); } 可以正常运行呢？

user: user-4
content: 引用 28 楼 u010980545 的回复:[quote=引用 23 楼 u014485390 的回复:] [quote=引用 16 楼 hadues 的回复:] 引用stdio.h中有strlen()函数？ 应该有，虽然我不能十分确定，但是如果不这么理解？ 如何解释这两个代码编译链接运行都没有问题，都可以正确输出数组长度为3？ 方法一： #include <stdio.h> void main() {                  char s[]  = "abc";                   printf("数组的长度为：%d\n", strlen(s)); } 方法二：  #include <string.h> void main() {                   char s[]  = "abc";                   printf("数组的长度为：%d\n", strlen(s)); }   没有使用<stdio.h>也能使用printf?????[/quote]我在VC中试了一下，是可以的，但是不知道为什么，不知道其他的IDE行不行[/quote]好无奈，我没试过

user: user-0
content: 引用 57 楼 zhangshichuan972 的回复:中国的软件教育.o(︶︿︶)o 唉新手上路，有什么不对的还请阁下明示

user: user-0
content: 引用 51 楼 lin5161678 的回复:1 strlen 和库函数重名了 换一个名字 不要用这个名字  2 你的strlen 内的 变量n 没有初始化在for循环中初始化了的

user: user-5
content: 中国的软件教育.o(︶︿︶)o 唉

user: user-6
content: Rebuild All

user: user-7
content: 你为什么不单步调试？我这有单步时看到问题，他在}之后还在找跳

user: user-8
content: 1 strlen 和库函数重名了 换一个名字 不要用这个名字  2 你的strlen 内的 变量n 没有初始化

user: user-9
content: 引用 16 楼 hadues 的回复:引用stdio.h中有strlen()函数？ 应该有，虽然我不能十分确定，但是如果不这么理解？ 如何解释这两个代码编译链接运行都没有问题，都可以正确输出数组长度为3？ 方法一： #include <stdio.h> void main() {                  char s[]  = "abc";                   printf("数组的长度为：%d\n", strlen(s)); } 方法二：  #include <string.h> void main() {                   char s[]  = "abc";                   printf("数组的长度为：%d\n", strlen(s)); }  正好我看C primer plus正好看到strlen（）这个函数在string.h头文件不是stdio.h头文件

user: user-10
content: 不错 学习了

user: user-11
content: 引用 30 楼 u010408449 的回复:引用 21 楼 u012843100 的回复:你重写了strlen函数，在你的strlen函数里面，for循环中每次循环都打印出n的值。*s实际上是数组s的第一个元素a，ASCII码61，接着for循环的递增语句s++，是对地址的自增，这里得到的值是不可预料的。由于你的程序中没有包含头文件<string.h>，所以你的主程序中调用strlen，调用了你自己写的strlen函数，在for循环中不断的打印n的值，至于这个值就因每次调用时候内存的状态不同而不同数组在内存中占用的是一段连续的内存单元吧，地址自增就指向下一个内存单元中的元素，数组中的元素在初始化的时候就已经知道了，所以指针每次指向的下一个内存单元中的值都是可以预知的吧，直到指针指向'\0'就结束循环，而且我打印的是n的值，也不是数组中的元素啊，你说n的值跟每次调用的内存状态有关，但是实际上我每次运行结果都是一样的。从VC中的云翔结果来看，貌似strlen函数被调用了很多次。之前是我太轻薄，没仔细看过代码，还请见谅。还是等大神吧

user: user-11
content: 引用 26 楼 hadues 的回复:[quote=引用 21 楼 u012843100 的回复:] 你重写了strlen函数，在你的strlen函数里面，for循环中每次循环都打印出n的值。*s实际上是数组s的第一个元素a，ASCII码61，接着for循环的递增语句s++，是对地址的自增，这里得到的值是不可预料的。由于你的程序中没有包含头文件<string.h>，所以你的主程序中调用strlen，调用了你自己写的strlen函数，在for循环中不断的打印n的值，至于这个值就因每次调用时候内存的状态不同而不同           看了您的评论，感觉很有道理。确实如果按照您这么理解，假设是楼主重写了strlen函数，打印出那种结果按您这么理解倒也行得通。           可是当调用完毕楼主自己写的strlen函数后，程序还会再次调用系统#include <stdio.h>库函数中的strlen函数？这就不是很理解啦。          还有这重写和编译器不知有什么关系，vc++6.0运行该代码会出错，而codeblocks编译器运行相同代码却没有报错？[/quote]确实我只是看了下代码就乱说了，多谢提醒。刚开始还以为最后的结果是巧合，刚刚运行了下，发现确实没那么简单，每次都会输出”数组长度为：3“。还是坐等大神吧

user: user-12
content: 路过学习，继续加分

user: user-13
content: 反汇编看看发生了什么

user: user-0
content: 引用 47 楼 u011584079 的回复:引用 20 楼 u010980545 的回复:[quote=引用 17 楼 u011584079 的回复:] [quote=引用 10 楼 u010980545 的回复:] [quote=引用 9 楼 u013697891 的回复:] 我的输出123，数组长度是3现在可以确信是我的机器或者软件的问题了，但是这不科学啊 我用vc跑了，结果还是对的啊，你是不是后缀名。你是怎么建的工程[/quote]new 一个32位的控制台程序啊，看前面几位大哥的回复，貌似只有使用VC的时候运行结果才不对[/quote] 为何我的vc跑出的结果跟你的不一样，[/quote]估计用的是不同版本的吧，这个问题有点纠结，决定不用VC，用VS

user: user-14
content: 引用 20 楼 u010980545 的回复:引用 17 楼 u011584079 的回复:[quote=引用 10 楼 u010980545 的回复:] [quote=引用 9 楼 u013697891 的回复:] 我的输出123，数组长度是3现在可以确信是我的机器或者软件的问题了，但是这不科学啊 我用vc跑了，结果还是对的啊，你是不是后缀名。你是怎么建的工程[/quote]new 一个32位的控制台程序啊，看前面几位大哥的回复，貌似只有使用VC的时候运行结果才不对[/quote] 为何我的vc跑出的结果跟你的不一样，

user: user-14
content: 引用 16 楼 hadues 的回复:引用stdio.h中有strlen()函数？ 应该有，虽然我不能十分确定，但是如果不这么理解？ 如何解释这两个代码编译链接运行都没有问题，都可以正确输出数组长度为3？ 方法一： #include <stdio.h> void main() {                  char s[]  = "abc";                   printf("数组的长度为：%d\n", strlen(s)); } 方法二：  #include <string.h> void main() {                   char s[]  = "abc";                   printf("数组的长度为：%d\n", strlen(s)); }   建议你去翻一下msdn