我正在从文件中读取输入并尝试从我接收的字符串中创建数值。
我尝试过简单地使用atoi,但这并不适用于角色。 然后我尝试在我的数组字符上使用forloop,但后来我得到了错误,因为有些字符实际上是整数。 然后我尝试使用if语句检查字符本身是否为整数,并将其添加到我的" sum"手动。
但到目前为止,我得到的只是错误和错误,我不确定我的逻辑错在哪里。
在C中,数组只是一个指针对吗?所以要访问某个索引的值,我使用* arr [num]吧?
这是我的代码
char newlineC;
char input[14];
while(fscanf(fp,"%s%c",input, &newlineC)!=EOF){
int val = 0;
int x;
for(x=0; x<14; x++){
if(isdigit(*input[x])){
val = val + input[x];
}else{
int p = atoi(input[x]);
val = val + p;
}
}
我已经尝试过控制功能......也没有用。我已经这么久了,我感到愚蠢,我被困在一些看起来如此简单的事情上。任何帮助表示赞赏。
答案 0 :(得分:1)
你传遍了错误的类型。
char input[14];
这声明了一个维度为char
的数组。input[i]
是i
char
个
数组,它有类型char
。它不是指针,你不能取消引用它,
这就是*input[x]
失败的原因。实际上编译器应该给你一个
错误,这个错误:
invalid type argument of unary ‘*’ (have ‘int’)
与atoi
同样的问题。它期望指向char
的指针指向a
串。 input[x]
是单char
,您无法转到atoi
。再一次
编译器应该警告过你。
fscanf(fp,"%s%c",input, &newlineC)
这非常笨拙。如果输入大于13个字符,您将 溢出缓冲区。更好的方法是:
fscanf(fp, "%13s%c", input, &newline);
甚至更好
int val;
fscanf(fp, "%d", &val);
另一个错误:如果你知道input[x]
是一个数字,那么整数就是
数字代表是input[x] - '0'
。所以这应该是计算:
val = val + input[x] - '0';
总的来说,我会使用fgets
和strtol
:
while(fgets(input, sizeof input, fp))
{
long int val;
char *tmp;
val = strtol(line, &tmp, 0);
if(*tmp == 0 || *tmp == '\n')
printf("An integer was read: %ld\n", val);
else
printf("More than an integer was read: '%s'\n", line);
}
答案 1 :(得分:0)
如果您只是将字符[1..0]转换为整数值,那么您只需
int main(void) {
char input[14];
scanf("%s", input);
if (isdigit(input[0])) {
int num = atoi(input);
printf("%d\n", num);
}
else {
printf("INPUT ERROR\n");
}
}
您是否也希望处理字母字符并将其转换为某个整数值?
答案 2 :(得分:0)
C中的数组基于指针,但并非全部。 C中的数组只是内存中一行中的一堆数据类型。这样你就可以访问前导变量的指针,而不是跳下该列表以获得数组的下一次迭代。
isdigit(*input[14])
此行会导致问题。看看input
本身是什么。 input是指向该数组中第一个元素的指针。输入基本上是在说char* input = &array[0];
所以假设你取消引用没有那个14的输入变量,你会得到第一个元素。所以我们可以说*input = array[0];
你在这里看到了这个问题吗?你基本上解除了它两次。如果您刚刚完成了insdigit(input[14])
,那会更好一些。
但是这里涉及更大的问题。你正在使用一个只包含字符的字符数组,而你正在尝试将它们转换为数字。请记住,char和int是两种不同的数据类型。请继续查看此表:https://upload.wikimedia.org/wikipedia/commons/d/dd/ASCII-Table.svg
回想一下,字符基本上只是与该ASCII值对应的数字。例如,您的计算机不会将字母读为D,而是将其读作68(或二进制格式为68)。对于数字它是相同的概念,即使它看起来只是一个数字,你应该能够将它添加到val
,你首先必须减去48或使用数字上的atoi函数。
那你能在这做什么?我不能确切地说,因为我不知道你想要做什么,因为我不知道你的具体需求,但只是意识到你已经可以很容易地将char转换成int。我相信你可以添加一个字符到一个int,虽然我可能会弄错(我知道有一个非常简单的方法来添加一个char的值,也许你必须先把它投出来?)但是请记住,如果你想要数字要计算面值,你必须先从它们中减去48。
如果你想使用atoi你可以,但老实说,我没有在这里看到需要,因为你已经在这里将常规字符转换为数字。检查char值是否在48到58之间(或者实际数字是多少)就足够了,如果它们是,那么你可以减去它。
希望这有帮助!