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

仿atoi功能程序添加for循环后无输出,删除则正常,求原因

问题分析与解决:野指针引发的未定义行为

你的代码核心问题是野指针非法访问内存,导致了不可预测的未定义行为:

你声明了char *string;但没有为它分配任何内存空间,这是一个指向随机内存地址的野指针。当你用scanf("%s", string);往里面写入输入内容时,会非法篡改不属于程序的内存区域——这种行为的结果是不确定的:有时候删除for循环时,内存错误没有立刻触发崩溃,程序看似能运行;但添加for循环后,内存布局的变化让错误直接暴露,程序异常终止,所以没有任何输出。

修正方案

有两种简单的方式解决这个问题:

方案1:使用固定大小的字符数组

直接定义足够容纳输入数字的字符数组,避免野指针问题:

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

int main() {
  int cont = 0, array[10];
  // 定义足够大的数组,比如容纳最多9位数字+结束符
  char string[100];
  printf("Insert a number: ");
  scanf("%s", string);
  
  while (string[cont] != 0) {
    // 用'0'替代48,代码可读性更高
    printf("%d\t", string[cont] - '0');
    array[cont] = string[cont] - '0';
    cont++;
  }
  for (int i = 0; i < 3; i++) {
    printf("bruh\n");
  }
  
  // 实现你想要的atoi功能
  long long result = 0;
  for (int i = 0; i < cont; i++) {
    result = result * 10 + array[i];
  }
  printf("\n转换后的整数:%lld\n", result);
  
  return 0;
}

方案2:动态分配内存

如果需要更灵活的内存大小,可以用malloc动态分配,记得最后释放内存:

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

int main() {
  int cont = 0, array[10];
  // 分配100字节的内存空间
  char *string = malloc(100 * sizeof(char));
  // 检查内存分配是否成功
  if (string == NULL) {
    perror("内存分配失败");
    return 1;
  }
  
  printf("Insert a number: ");
  scanf("%s", string);
  
  while (string[cont] != 0) {
    printf("%d\t", string[cont] - '0');
    array[cont] = string[cont] - '0';
    cont++;
  }
  for (int i = 0; i < 3; i++) {
    printf("bruh\n");
  }
  
  // 实现atoi功能
  long long result = 0;
  for (int i = 0; i < cont; i++) {
    result = result * 10 + array[i];
  }
  printf("\n转换后的整数:%lld\n", result);
  
  // 释放动态分配的内存
  free(string);
  return 0;
}

额外注意点

  • 用string[cont] - '0'替代-48,代码可读性更强,因为字符'0'的ASCII值就是48。
  • 用long long存储转换结果可以避免输入大数字时的整数溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:01:05