我正在玩K& R书中的指针,我编写了这个程序,它交换整数并用指针测量字符串的长度。第一部分有效但我的字符串长度函数什么都不做。程序编译并运行第一部分,然后程序停止响应。
#include <stdio.h>
extern int a2 = 4;
extern int b2 = 5;
void swap(int *px, int *py);
int strlen2(char *s);
//int printLabel(char *thelabel, char newliner);
//int printLabel(char *thelabel, char newliner)
//{
// int stringlength1=(strlen2(thelabel));
// return stringlength1;
//}
void swap(int *px, int *py) /* interchange *px and *py */
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
int strlen2(char *s)
{
int n;
for (n = 0; *s != '\0', s++;)
n++;
return n;
}
int main()
{
int a=4;
int b=5;
char newliner = '\n';
swap(&a,&b);
swap(&a2,&b2);
printf("%d",a);
printf("%c",newliner);
printf("%d",b);
printf("%c",newliner);
printf("%d",a2);
printf("%c",newliner);
printf("%d",b2);
printf("%c",newliner);
char sumstring[]="boo";
char *labelPtr;
labelPtr = sumstring;
int length = strlen2(labelPtr);
printf("%d",length);
return 0;
}
答案 0 :(得分:3)
问题在于:
for (n = 0; *s != '\0', s++;)
是一个半无限循环。它检查终止NUL,但是它忽略了比较和接受的结果,如果它是非空的则继续循环。一旦它越过字符串的结尾,结果就是未定义的行为,但它可能永远循环或崩溃。
你可能意味着
for (n = 0; *s != '\0'; s++)
答案 1 :(得分:0)
在for循环中,第二个表达式通常是一个条件,在你的情况下* s!='\ 0'。 第三个表达式是增量,你应该增加s指针。
这很好用:
int strlen2(char *s)
{
int n;
for (n = 0; *s != '\0'; s++)
n++;
return n;
}
答案 2 :(得分:0)
看起来像代码中的拼写错误。这条线不应该是:
for (n = 0; *s != '\0'; s++)
而不是
for (n = 0; *s != '\0', s++;)
答案 3 :(得分:0)
使用以下内容替换您的代码:
int strlen2(char *s)
{
int n = 0;
while(s[n] != '\0')
++n;
return n;
}
答案 4 :(得分:0)
用于statmenet
for (n = 0; *s != '\0', s++;)
在条件部分中使用了逗号运算符
*s != '\0', s++
其结果是s++
的最后一个子表达式的值。由于指针s不等于0,因此你至少得到很长的sycle。
我认为你的意思是
for (n = 0; *s != '\0'; s++ )