【问题标题】:passing in pointers as arguments to get string length将指针作为参数传递以获取字符串长度
【发布时间】:2014-08-14 21:09:29
【问题描述】:

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

【问题讨论】:

  • 另外,试试 printf("%d\n", a);而不是两个 printf 行。您也可以折叠 printf("%d\n%d\n%d\n", a, b, a2) 等语句。
  • 次要:最好使用类型size_tsize_t strlen2(char *s) { size_t n; ...size_t length ... printf("%zu",length);

标签: c arrays string function pointers


【解决方案1】:

问题是这样的:

for (n = 0; *s != '\0', s++;)

是一个半无限循环。它检查终止的 NUL,但随后忽略该比较的结果并递增 s,如果它为非 null,则继续循环。一旦超过字符串的末尾,结果就是未定义的行为,但它可能会永远循环或崩溃。

你可能是说

for (n = 0; *s != '\0'; s++)    

【讨论】:

  • 很奇怪。在书中,它是这样显示的。谢谢。这解决了它。
【解决方案2】:

在 for 循环中,第二个表达式通常是一个条件,在您的情况下是 *s != '\0'。 第三个表达式是增量,你应该在其中增加 s 指针。

这工作正常:

int strlen2(char *s)
{
    int n;

    for (n = 0; *s != '\0'; s++)
        n++;

    return n;
}

【讨论】:

    【解决方案3】:

    将您的代码替换为以下内容:

    int strlen2(char *s)
       {
           int n = 0;
           while(s[n] != '\0')
              ++n;
           return n;
       }
    

    【讨论】:

      【解决方案4】:

      看起来像是代码中的错字。这行不应该是:

      for (n = 0; *s != '\0'; s++)
      

      而不是

      for (n = 0; *s != '\0', s++;)
      

      【讨论】:

        【解决方案5】:

        在此用于 statmenet

        for (n = 0; *s != '\0', s++;)
        

        在条件部分使用了逗号操作符

        *s != '\0', s++
        

        它的结果是s++ 的最后一个子表达式的值。由于指针 s 不等于 0,那么您至少会得到很长的 sycle。

        我认为你的意思是

        for (n = 0; *s != '\0'; s++ )
        

        【讨论】:

          猜你喜欢
          • 2023-04-08
          • 2014-08-05
          • 2019-04-24
          • 2013-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-24
          • 1970-01-01
          相关资源
          最近更新 更多