平等操作员不工作`c`

时间:2013-09-29 14:02:12

标签: c pointers equality

我正在尝试计算.在命令行传入的单个字符串中出现的次数。

致电myprog "this...is a test."

返回The count is 0

我在这里做错了什么?

注意: 我知道此代码可能看起来很奇怪但是出于教育目的

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

  int len = strlen(argv[1]);
  char *d = malloc (strlen(argv[1])+1);
  strcpy(d,argv[1]);
  char *p=d;
  int count;
  count=0;  
  while(*p){
    if (*p ==','){
      count++;
    }
    *p++;
  }

  printf("The count is: %d\n", count);
  return 0;
}

4 个答案:

答案 0 :(得分:4)

您正在计算逗号的数量,而不是句号。要计算句点,请将if语句更改为:

if (*p =='.'){
  count++;
}

答案 1 :(得分:3)

这段代码有很多......奇怪之处。有点难以猜测哪些是故意的,哪些不是故意的,所以让我们一行一行地看看它是什么。

int len = strlen(argv[1]);
char *d = malloc (strlen(argv[1])+1);
strcpy(d,argv[1]);

您可能希望在某些时候使用 len,但就像现在一样,您获得len,然后重新计算相同的值以供使用它。据推测,你想要的更像是:

size_t len = strlen(argv[1]);
char *d = malloc(len+1);
strcpy(d, argv[1]);
但是,我注意到,没有理由这样做。由于您只是想检查内容,您可以直接使用argv[1](或创建指向同一位置的另一个指针并使用它)。

char *p=d;

这会创建另一个指向与d相同位置的指针。你真的不需要d开始,你也不需要这个,但它是相当无害的。

int count;
count=0;  

我(强烈)希望看到count初始化而不是未初始化,然后再分配一个值。由于它不可能是否定的,我可能也会使它成为无符号类型:size_t count = 0;

while(*p){
  if (*p ==','){
    count++;
  }
  *p++;
}

正如其他人已经指出的那样,你在这里比较错误的价值。但是,我还要注意,当你进行初始化,测试和某种“增量”操作时,使用for循环代替{{1}几乎肯定会更好。 }循环。

另外,这里增量部分有点不对。你真的只想要while,而不是p++

*p++

当我们开始讨论它时,该循环的略微修改版本几乎是我们对整个任务真正需要的全部内容:

for (char *p=d; *p; ++p)
   if (*p == '.')
       ++count;

答案 2 :(得分:1)

更改

if (*p ==',')  

if (*p =='.')  

计算.

答案 3 :(得分:1)

我相信只有一个错字。用。。。来代替 '。'并且它将返回“4”,我刚刚测试过它。