【问题标题】:Why is this C Program not running on Microsoft Visual Studio?为什么这个 C 程序不在 Microsoft Visual Studio 上运行?
【发布时间】:2020-11-17 00:10:54
【问题描述】:

我尝试在 Visual Studio 中构建后运行,而没有任何警告或错误。

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

int e = 0;
int num = 0;
int a = 0;
int n = 0;
int c = 0;

static int factorial();

int factorial(int e){
  if (e == 0)
    return 1;
  else if (e == 1)
    return 1;
  else
  return e * factorial(e - 1);
}

int main() {
  int k = 0;
  int i = 0;
  int j = 0;
  int f = 0;
  int r = 0;

  printf_s(" Enter a number for length of string");  
  scanf_s("%d", &n);
  printf_s(" Enter a number for choice of string");
  scanf_s("%d", &k);
  f = factorial(n) / (factorial(n - 2) * 2);
  char **arr = (char **)malloc(n * sizeof(char *));
  
  for (i = 0; i < n; i++){
    arr[i] = (char*)malloc(f * sizeof(char));
  }

  for (i = 0; i < n; i++){
    for (j = 0; j < f; j++) {
      *(*(arr + i) + j) = '\0';
    }
  }

  for (i = 1; i < n; i++){
    num = 0;
    for (j = 0; j < i; j++){
      while (num <= n){
        if ((num == j) || (num == i))
          arr[r][num] = 'b';
        else
          arr[r][num] = 'a';
      }
    }
    r++;
  }

  for (i = 0; i < n; i++) {
    for    j = 0; j < f; j++) {
      printf_s("%c ", arr[j][i]);
    }
  }
}

输入后控制失控。 空白字符、换行符、任何字符、字符串或乱码不会产生任何 区别 。我也对调用阶乘函数有疑问 像一个表达式。

【问题讨论】:

  • 我冒昧地对您的代码进行了格式化以使其更具可读性。 “输入后控制失控” - 这是一个令人沮丧的模糊描述。你提供了什么输入,行为是什么?程序崩溃了吗?你没有得到预期的输出吗?它没有终止吗?
  • 我立即看到的一个问题是你没有正确终止你的字符串 - 在你写'a''b'arr[r][num]的中间循环中,你需要循环while num 严格小于 n (while (num &lt; n)) 并且循环结束时写入arr[r][num] = 0;
  • 我怀疑您是否可以毫无错误地构建此程序。 for j = 0; j &lt; f; j++) { 行不应该编译。您是否忘记在while (num &lt;= n){ 的正文中增加numnum = 0; 在外部 for 循环中是否正确,还是应该在 while 循环之前的内部循环中?
  • 知道factorial(n) / (factorial(n - 2) * 2)n*(n-1)/2 相同可能会有所帮助。更简单,不是吗?
  • @MauryaMoharar:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。

标签: c controls malloc runtime


【解决方案1】:

我知道这应该是评论,但由于我缺乏声誉点,我无法发表评论。但据我了解,这段代码 sn-p:

'for (i = 0; i < n; i++) {
    for    j = 0; j < f; j++) {
      printf_s("%c ", arr[j][i]);
    }
  }
}'

有错误;在第二个 for 循环中应该有一个左括号。尽管出现编译错误,但您是如何设法运行它以获得我不知道的运行时错误。我认为您粘贴了旧版本的代码。除此之外,我承认我什至不知道 printf_s() 函数。从我在系统上运行的内容来看,它抛出了对 printf_s() 和 scanf_s() 的未定义引用。如果它是内置函数,请确保您已包含其头文件。除此之外在这段代码sn-p中:

for (i = 1; i < n; i++){
    num = 0;
    for (j = 0; j < i; j++){
      while (num <= n){
        if ((num == j) || (num == i))
          arr[r][num] = 'b';
        else
          arr[r][num] = 'a';
      }
    }
    r++;
  }

在 while 循环中 numn 不会改变,所以它是一个无限循环。我认为这是您错误的主要原因。

【讨论】:

  • 实际上,在复制此代码时,括号被删除了。谢谢。
【解决方案2】:

factorial()是可以的,但是return

之后写else没意义
int factorial(int e)
{
    if (e == 0) return 1;
    if (e == 1) return 1;
    return e * factorial(e - 1);
};

当然,你也可以使用 ||

编写单个 if()

您的阶乘原型缺少参数,如 int factorial(int);

第 56 行缺少一个左 '(',其他人指出的 for j = 0

在这段代码中

    for (i = 0; i < n; i++) {
    arr[i] = (char*)malloc(f * sizeof(char));
}

for (i = 0; i < n; i++) {
    for (j = 0; j < f; j++) {
        *(*(arr + i) + j) = '\0';
    }
}

您可以在第一个循环中初始化字符串。无需再次循环进入它们

请注意,scanf()safe 版本期望每个 %c %s 或 %[ ] 类型的说明符都有一个大小参数(这里不是这种情况,您仅使用 %d)。

你能多写一点程序的逻辑吗?

【讨论】:

    【解决方案3】:

    问题确实在于使用阶乘函数计算f

    f = factorial(n) / (factorial(n - 2) * 2);
    

    factorial 增长非常很快。对于n = 13,您的实现超出了int 类型的范围。从技术上讲,您会得到未定义的行为,实际上为f 计算的值是没有意义的,它甚至可能是负数,如果factorial(n - 2) 计算为0,除法将崩溃,这将发生在n 大于的任何值35.

    这是一个更简单的表达式,直到n = 46340

    f = n * (n - 1) / 2;
    

    代码中还有其他问题:

    • 您没有测试scanf_s() 读取数字失败
    • 您没有测试分配失败
    • 使用arr[i] = calloc(f, sizeof(char)); 可以避免初始化循环,因为间接二维矩阵已经初始化为所有位 0。
    • num 在循环 while (num &lt;= n) 中没有被修改,这使它成为一个无限循环,对您的观察的另一个很好的解释
    • k 不在任何地方使用
    • 不清楚您要达到的目标。一些 cmets 可能会对您的代码的普通读者有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多