我对C编程和学习K& R C编程语言书非常陌生。我正在尝试编写一个程序,将十六进制数重复转换为十进制数,并希望在我的代码中使用一个函数。有一些问题阻止我理解C.我已经读过它们但没有清楚地理解。
我想读取长度最大为4的输入,但据我所知,虽然char数组的长度为4,但scanf()并不限制长度。所以我试图用for循环消除非整数字符。这个可以吗?从用户那里获取输入的正确方法是什么?我不想使用while((cr=getchar())!=EOF)
。
当我运行程序时,我收到一条错误消息:“未定义引用'转换'”。我该如何定义函数?
我使用Code :: Blocks 16.01和MinGW。
这是我的尝试:
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#define LENGTH 4
int convert (char hex[]);
int result,validLength,j;
char input[LENGTH];
int main(){
while(1){
printf("Please enter valid hexadecimal number %d length:",LENGTH);
scanf("%c", input); //reading to char array
for(j=0;j<LENGTH;j++) // buffer
if(input[j] > 48 && input[j] < 58)
validLength++;
printf("Here is the decimal result: %d", convert(input[validLength]));
validLength=0;
}
int convert(char hex[]){
int t;
for(t=0; t < validLength; t++)
result= result+ hex[t]*(pow(16,(validLength-t)));
return result;
}
return 0;
}
答案 0 :(得分:1)
1]你不能拥有嵌套功能。将它移出体外。
2]这里
printf("Here is the decimal result: %d", convert(input[validLength]));
您正在传递char
,但convert
函数需要char*
。正确的:
printf("Here is the decimal result: %d", convert(input));
3] %c
说明符适用于字符,使用%s
,最好使用多少个字符来读取%4s
。别忘了检查返回值,例如
if(scanf("%4s", input) != 1)
{
// Fail
}
答案 1 :(得分:0)
这是无效的:
scanf("%c", input);
%c
格式说明符只能读取单个字符。如果要读取字符串,则需要使用%s
。此外,您应该在此字段上放置一个长度修饰符,以指定要读取的最大字符数:
scanf("%4s", input);
您需要将input
个元素放大,以便为终止空字节留出空间。
此外,您试图在convert
功能中定义main
功能。标准C不支持嵌套函数。
您需要将convert
的定义移到main
之外:
int convert (char hex[]);
int result,validLength,j;
char input[LENGTH+1];
int convert(char hex[]){
int t;
for(t=0; t < validLength; t++)
result= result+ hex[t]*(pow(16,(validLength-t)));
return result;
}
int main(){
while(1){
printf("Please enter valid hexadecimal number %d length:",LENGTH);
scanf("%4s", input); //reading to char array
// initialize validLength, otherwise you increment an uninitialized value
validLength = 0;
for(j=0;j<LENGTH;j++) // buffer
if(input[j] > 48 && input[j] < 58)
validLength++;
// null terminate after the invalid characters
input[validLength] = 0;
printf("Here is the decimal result: %d", convert(input));
validLength=0;
}
return 0;
}
答案 2 :(得分:0)
您已在主要功能中定义convert
- 将其移到外面并修复错误。
此外,为了存储长度为scanf
的结果,input
应为5,因为所谓的C字符串以NULL结尾。 (例如,当您键入A0CD时,输入中的值将为{'A', '0', 'C', 'D', 0}