如何组合两个字符串,然后将其转换为 C 中的整数
Posted
技术标签:
【中文标题】如何组合两个字符串,然后将其转换为 C 中的整数【英文标题】:How do I combine two strings and then convert it to an integer in C 【发布时间】:2015-01-30 00:12:35 【问题描述】:我正在读取一个包含数字的数据文件并提取一些数字并将它们转换为一个整数。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
FILE* fp = fopen("data.txt", "r");
int i;
char data[5];
for(i = 0; i < 5; i++)
data[i] = fgetc(fp);
fclose(fp);
我有一个 char 矩阵中的日期数组,并且想要为日期月份和年份设置单独的数组。如何从数据文件中取出任何 n 个数字并将它们转换为 n 位整数?我尝试了 strcat 和 atoi,但我对指针缺乏理解,并且经常收到错误消息?
输入输出:
输入数据(银行对账单):
09,08,2014,"BOOK SHOP",12.34,5.67,
10,08,2014,"CAR MECHANIC",52.44,5.67,
11,08,2014,"CHIP SHOP",67.34,5.67,
所需的输出是日期、月份、年份、购买地点、金额和余额的单独数组。我每个都有单独的数组,但数字是字符串而不是整数。如何将每列转换为整数数组?
【问题讨论】:
我不懂问题。你能提供输入/输出数据的例子吗? 你试过 fscanf(fp, "%d", &data[i]) 吗? 如果这就是你的意思,没有任何空行,输入中有一个新行的隐藏字符,但它不是问题。 【参考方案1】:如果您NULL
终止您的字符数组,那么就 C 而言,它实际上是数字的字符串表示形式。然后你可以直接在上面使用atoi()
:
int data_int;
char data_str[N+1];
for (i = 0; i < N; i++)
data_str[i] = fgetc(fp);
/* to be really sure, you should make sure each character
* you read is a decimal digit from '0' - '9'
*/
data_str[N] = '\0';
data_int = atoi(data_str);
【讨论】:
【参考方案2】:我假设您有兴趣阅读以下数据行:
09,08,2014,"BOOK SHOP",12.34,5.67,
10,08,2014,"CAR MECHANIC",52.44,5.67,
11,08,2014,"CHIP SHOP",67.34,5.67,
看起来你可以使用fscanf()
,但你需要小心:
int day[20];
int month[20];
int year[20];
char name[20][15];
double amount[20];
double balance[20];
for (int i = 0; i < 20; i++)
if (fscanf(fp, "%d ,%d ,%d , \" %14[^\"] \" ,%lf ,%lf ,",
&day[i], &month[i], &year[i], name[i],
&amount[i], &balance[i]) != 6)
break;
您可能不需要每个空格,并且您永远不会知道该行的最后一个逗号是否丢失。请注意,代码通过限制循环上的迭代次数和限制字符串字段的长度来避免缓冲区溢出。我选择15
作为名称的长度只是为了清楚哪个数字是条目数,哪个是每个条目的长度。
您可能更喜欢fgets()
和sscanf()
方法:
int day[20];
int month[20];
int year[20];
char name[20][15];
double amount[20];
double balance[20];
char buffer[4096];
int i; // Outside loop so it can be accessed after the loop
for (i = 0; i < 20 && fgets(buffer, sizeof(buffer), fp) != 0; i++)
if (sscanf(buffer, "%d ,%d ,%d , \" %14[^\"] \" ,%lf ,%lf ,",
&day[i], &month[i], &year[i], name[i],
&amount[i], &balance[i]) != 6)
break;
这将拒绝不匹配的行,而直接使用fscanf()
的原始代码将处理如下数据:
09,08,2014,"BOOK SHOP",12.34,5.67,10,08,2014,"CAR MECHANIC",
52.44,5.67,11,
08,
2014,
"CHIP SHOP",
67.34,
5.67,
显示的代码或多或少地替换了问题中从char data[5];
到循环结束的行。您可以添加代码以打印读取的值。
for (int j = 0; j < i; j++)
printf("%.4d-%.2d-%.2d %-14s %8.2f %8.2f\n",
year[j], month[j], day[j], name[j], amount[j], balance[j]);
【讨论】:
#includeint main(void)
等等。不过,它们非常常规。
我在您的评论中没有看到对数据数组的任何引用,它是如何知道从哪里获取数据的
如果我必须用scanf输入数据,那么scanf对我没有用,因为数据已经在文本文件中了。
刷新答案;它已经使用fscanf()
几分钟了。在任何情况下,在大多数系统上,您都可以运行./your_program < data.txt
,您的标准输入将来自数据文件。没有引用data
数组; data
数组在读取格式化数据时没有用。它不足以将大部分数据字段保存为字符串。名称不是整数;金额或余额字段也不是。如果您愿意,可以将fgets()
/sscanf()
变体中的buffer
重命名为data
。以上是关于如何组合两个字符串,然后将其转换为 C 中的整数的主要内容,如果未能解决你的问题,请参考以下文章