c - 变量从 atoi 赋值中丢失它的值
问题描述
我是 C 的新手。
我试图从命令行参数中获取一个数字,并在整个代码中的多个计算中使用它。命令行中输入的数字显然是作为字符串返回的,因此我试图将其转换为数字以避免使用 char 产生的所有计算错误。
我没有学过 atoi 或 stdlib.h,所以我什至不确定这是我应该如何解决这个问题,但这是我能找到将字符串转换为数字的唯一方法。
当我声明一个新变量as = atoi(argv[1]);
并打印它以验证一切似乎都很好。
然后我的代码执行了一些其他看似不相关的操作,当我再次 printf 我的变量时,值为 0。我不明白为什么当我不重新声明变量时值会发生变化,但这意味着接下来的任何计算都不会工作。
任何想法我做错了什么?
编辑:如果我直接将'key'声明为整数,则程序没有问题,当我尝试从数组中提取整数时问题就来了。{ 在 main() 之后,但它不会在帖子中格式化。
int main(int argc, string argv[]) {
string msg[0];
int key = atoi(argv[1]);
if (argc != 2) {
printf("This function requires one command line argument: key\n");
return 1;
}
if (key < 1) {
printf("error\n");
return 1;
}
// At this point variable 'key' is ok and equals the value entered in command line
msg[0] = get_string("text:");
// After this point variable 'key' value is 0 unless I redeclare it
int n = strlen(msg[0]);
解决方案
问题是您在msg
数组范围之外编写。
string msg[0];
声明一个没有元素的数组。所以分配给任何元素都会写在它外面,导致未定义的行为。当您分配时会发生这种情况
msg[0] = get_string("text:");
您需要使用要存储在其中的实际最大元素数来声明数组。如果您将其声明为
string msg[10];
您可以msg[0]
通过msg[9]
.
推荐阅读
- parameters - sklearn RandomForestRegressor: number of trainable parameters
- docker - 如何使用 JHipster Registry [Docker] 修复无效的 JWT?
- visual-studio-code - Visual Code, Fold Comments
- c# - How to use C# in keyword in typescript?
- python - 从其他数据帧逐行查找
- spring-boot-admin - Spring Boot Admin 2.0.1 最低 Spring Boot 版本
- ruby-on-rails - Rails 5. 如何使用上传控制器通过调度每条记录来处理批量上传
- python - Keras LSTM 训练。如何塑造我的输入数据?
- laravel - Laravel 从多条消息中获取用户
- java - 在依赖项中通过 Spring 设置变量?