C语言实现字符转ASCII时编译报variable-sized object错误怎么办
错误根因
你遇到的variable-sized object may not be initialized报错是C语言的标准限制:长度由变量指定的可变长度数组(VLA)不支持在定义时直接初始化,触发报错的核心是conversion函数里的错误写法:
int ascii[i] = variable[i];
你这行代码的逻辑本身也存在问题:不需要每次循环都新建一个长度为i的数组,你要获取单个字符的ASCII值,直接把char类型转成int即可,完全不需要定义数组。
另外你的代码还存在三个额外问题:
printf(ascii[i]);写法不符合规范,printf第一个参数必须是格式字符串,输出整型需要用%d占位符- 定义
input函数时指定返回值为char,但函数内没有return语句,会触发未定义行为 - main函数里定义的
int ascii[stringlength]没有实际使用,属于冗余代码
修复方案
1. 修正conversion函数逻辑
直接转换单个字符的ASCII值输出即可:
void conversion(int stringlength){ for (i = 0; i < stringlength; i++) { int ascii_val = variable[i]; printf("%d ", ascii_val); } printf("\n"); }
2. 修正input函数返回值类型
不需要返回值就将返回值类型改为void:
void input(){ printf("输入你的字符串: "); fgets(variable, 100, stdin); stringlength = strlen(variable) - 1; }
3. 删除main函数里冗余的int ascii[stringlength];定义
完整可运行代码
#include <stdio.h> #include <string.h> // 全局变量定义 char variable[100]; char alphabet[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; int shift; int stringlength; int i; // 输入字符串并写入全局变量 void input(){ printf("输入你的字符串: "); fgets(variable, 100, stdin); stringlength = strlen(variable) - 1; } // 输入偏移值并校验范围在0-25之间 int inputandtest(){ int shift; printf("请输入1到26之间的数字: "); scanf("%d", &shift); shift --; // 校验输入的偏移值是否在字母表索引范围内 while (shift < 0 || shift > 25){ printf("数字无效,请重新输入: "); scanf("%d", &shift); shift--; } return shift; } // 将字符串每个字符转为ASCII值输出 void conversion(int stringlength){ printf("字符串对应的ASCII值序列:"); for (i = 0; i < stringlength; i++) { int ascii_val = variable[i]; printf("%d ", ascii_val); } printf("\n"); } // 主函数 int main(){ input(); int shiftA; shiftA = inputandtest(); printf("字母表对应字母:%c\n", alphabet[shiftA]); printf("字符串长度:%d\n", stringlength); conversion(stringlength); return 0; }
内容的提问来源于stack exchange,提问作者georgelid6
相关产品推荐
相关产品推荐

