【问题标题】:How to count the number of times number 7 appears in an array如何计算数字7出现在数组中的次数
【发布时间】:2017-10-02 22:15:09
【问题描述】:
#include <stdio.h> 
#include <stdlib.h> 
#define LEN 5

int main() 
{ 
int i;
int count = 0;
 size_t *ptr = malloc(sizeof(size_t)*LEN); 

while(1){

 for(i=0;i<LEN;i++){ 
        scanf("%d",&ptr[i]); 
 } 


 for(i=0;i < ptr[i]; i++){ 

     if(ptr = NULL || sizeof(ptr) < 0){
    printf("nah");
 } else if(ptr[i] == 7){
            ++count;
        }
  } printf("%d", count);
    break;
  }
 free(ptr); 
 return 0;
} 

我要做的是找到数字 7 在 malloc 中出现的次数。计数效果很好但是我应该如何证明如果 mallocs size is less than zero, or if its NULL,它必须返回 -1?

另外,返回 -1 是什么意思?我对C编程很陌生... 任何帮助将不胜感激!

【问题讨论】:

  • ptr = NULLNULL 分配给指针,这不是您想要的。
  • 请:为了您自己,请正确格式化您的代码。
  • 提示:size_t *ptr = malloc(sizeof(size_t)*LEN);:动态分配内存以获得恒定大小 (LEN) 毫无意义。您可以改写size_t ptr[LEN]; 并删除free(ptr);
  • scanf("%d",&amp;ptr[i]); --> scanf("%zu", &amp;ptr[i]);, i &lt; ptr[i] --> i &lt; LEN

标签: c computer-science


【解决方案1】:

C 没有提供任何直接的工具来让程序知道函数中存在错误,因此我们依赖于函数的返回值。

例如,在您的情况下,只有大小为 0 或更大才有意义。如果发生“错误”,您可以返回 -1,等待程序结果的任何人都会将结果视为无效,并假设存在某种错误。

由于 C 语言本身并未对此进行处理,因此强制执行完全是按照惯例。如果运行您的程序的人没有检查该值,而是像使用“5”一样使用“-1”,他们将遇到没有明显原因的问题。

标准库提供的函数通常带有自己的返回值和错误约定。 malloc 就是其中之一。检查documentation,“返回值”在失败时为 NULL。对于返回指针的函数,将 NULL 作为失败返回是一种常见的约定。

在您的代码中,您可以添加 size_t *ptr = malloc(sizeof(size_t)*LEN); if (ptr == NULL) {return -1;} 正确检查返回值。

您希望尽快检查空值,因为在可能为 NULL 时使用 ptr 会导致 segfaults

另外请注意,您对sizeof 的使用在sizeof(ptr) &lt; 0 中是可疑的。 Sizeof 要么在 intsize_t 之类的类型上调用,要么在变量上调用。在这种情况下,您将获得指针类型的大小,就好像您调用了sizeof(size_t*)。查看documentation

最后一点,您正在制作size_t* 类型的ptr。指针类型几乎类似于整数或其他数字类型,因此sizeof(ptr) &lt; 0 条件永远不会为假。似乎您是 C 的新手,它使用指针和其他在其他语言中看不到的低级概念。在继续深入之前,我建议您巩固对 C 中的内存和指针的理解。我使用的一些资源是:TutorialsPointClass websitesNice free guideswikibooks

祝你好运!

【讨论】:

  • 非常适合初学者阅读和理解的答案。但是,请注意,sizeof 也绝对可以用于表达式/变量。查看您提供的相同链接,该页面中的第 2 点! :)
  • 感谢您了解,现在更改
【解决方案2】:

有很多问题:

这在for 循环中毫无意义,您应该在调用malloc 后立即进行该测试:

if(ptr = NULL || sizeof(ptr) < 0){
   printf("nah");

测试sizeof(ptr) &lt; 0 也是没有意义的(但在这里不会受到伤害),因为sizeof 的类型是无符号的,无论如何它不会是负数。

它是if (ptr == NULL) 而不是if (ptr = NULL)

while 循环毫无意义,你是在无条件地跳出它。

printf("nah"); 之后,程序应该退出并且不再继续。

而且你的程序缩进很糟糕,很难阅读。

这是一个修正版:

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

#define LEN 5

int main()
{
  int i;
  int count = 0;
  size_t *ptr = malloc(sizeof(size_t)*LEN);

  if (ptr == NULL) {
    printf("nah");
    return 1;
  }

  for (i = 0; i<LEN; i++) {
    scanf("%d", &ptr[i]);
  }

  for (i = 0; i < LEN; i++) {
    if (ptr[i] == 7) {
      ++count;
    }
  }

  printf("%d", count);

  free(ptr);
  return 0;
}

【讨论】:

  • scanf("%d", &amp;ptr[i]); --> scanf("%zu", &amp;ptr[i]);
猜你喜欢
  • 1970-01-01
  • 2015-04-15
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
相关资源
最近更新 更多