将指针作为参数传递以获取字符串长度

时间:2014-08-14 21:09:29

标签: c arrays string function pointers

我正在玩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;
}

5 个答案:

答案 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++ )