You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows平台下C语言程序字符输出不符合预期问题求助

C语言程序输出不符合预期的问题分析与修正

问题说明

我在Linux环境下用C99标准编写了一段C程序,输入内容为A B C D E F G H I J K L M N O时:

  • 实际输出:-A-- --B-- --C-- --D-- --E-- --F-- --G-- --H-- --I-- --J-- --K-- --L-- --M-- --N-- --O-- -
  • 预期输出:-A--B--C--D--E--F--G--H--I--J--K--L--M--N--O_

原程序代码如下:

int main() {
  char *arr = safeMalloc(sizeof(char) * 32);
  int sizeArr = 32;
  int cou = 0;
  while (scanf("%c", &arr[cou]) != EOF || cou == 10) {
    cou++;
    if(cou == sizeArr-2) {
      arr = realloc(arr, 2*sizeArr);
      sizeArr*2;
    }
  }
  for (int i = 0; i < cou; ++i) {
    printf("-%c-", arr[i]);
  }
  printf("\n");
}

代码问题分析

  1. scanf("%c")读取了空白字符:%c格式会读取输入中的所有字符,包括空格、换行符。输入里的空格被存进数组后,输出时会被格式化为- -,这就是实际输出中-- --部分的来源。
  2. 循环条件逻辑错误:while (scanf(...) != EOF || cou == 10)的逻辑不合理,||会导致即使输入结束(遇到EOF),只要cou ==10就继续循环,可能导致数组越界或多余的循环次数。
  3. 数组扩容后未更新sizeArr:sizeArr*2;这行只是计算了值,但没有赋值给sizeArr,导致后续扩容判断失效,可能引发数组越界。
  4. 输出格式不符合预期:printf("-%c-", arr[i])会给每个字符(包括空格、换行)前后加横杠,而预期是只给字母添加对应格式,最后以下划线结尾,而非横杠。

修正后的代码

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

// 假设safeMalloc是你实现的带错误检查的malloc,这里补一个示例实现
void *safeMalloc(size_t size) {
    void *ptr = malloc(size);
    if (!ptr) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    return ptr;
}

int main() {
  char *arr = safeMalloc(sizeof(char) * 32);
  int sizeArr = 32;
  int cou = 0;
  char ch;
  // 用" %c"跳过空白字符(空格、换行等),只读取字母
  while (scanf(" %c", &ch) != EOF) {
    arr[cou] = ch;
    cou++;
    // 检查是否需要扩容,预留一个位置给终止符(可选)
    if(cou == sizeArr - 1) {
      char *temp = realloc(arr, 2 * sizeArr);
      if (!temp) {
          perror("realloc failed");
          free(arr);
          exit(EXIT_FAILURE);
      }
      arr = temp;
      sizeArr *= 2; // 正确更新数组大小
    }
  }

  // 按预期格式输出
  if (cou > 0) {
      // 第一个字符格式:-A-
      printf("-%c-", arr[0]);
      // 后续字符格式:--B--C...
      for (int i = 1; i < cou; ++i) {
          printf("--%c", arr[i]);
      }
      // 最后添加下划线结尾
      printf("_");
  }
  printf("\n");

  free(arr); // 记得释放内存
  return 0;
}

修正点说明

  • 使用scanf(" %c", &ch):前面的空格会自动跳过输入中的空白字符(空格、换行、制表符等),只读取有效字母。
  • 修复数组扩容逻辑:将sizeArr*2;改为sizeArr *= 2;,确保扩容后数组大小正确更新;同时用临时指针接收realloc返回值,避免内存泄漏。
  • 调整输出格式:第一个字母输出-%c-,后续字母输出--%c,最后添加下划线_,完全匹配预期输出。
  • 添加内存释放:避免内存泄漏,这是C程序的良好习惯。

内容的提问来源于stack exchange,提问作者MaxVK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:25:19