所以我是C学生的第一年,我正在开展一个项目,我们必须在用户输入的给定基础上创建一个时间表。我几乎完全完成了它,但是我无法从表中删除前导零。
这就是简单的基本10表的样子。
andrew@andrew-VirtualBox ~/cs211/project1 $ ./timesTable 10
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
1 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
2 | 00 | 02 | 04 | 06 | 08 | 10 | 12 | 14 | 16 | 18 |
3 | 00 | 03 | 06 | 09 | 12 | 15 | 18 | 21 | 24 | 27 |
4 | 00 | 04 | 08 | 12 | 16 | 20 | 24 | 28 | 32 | 36 |
5 | 00 | 05 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 |
6 | 00 | 06 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 |
7 | 00 | 07 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 |
8 | 00 | 08 | 16 | 24 | 32 | 40 | 48 | 56 | 64 | 72 |
9 | 00 | 09 | 18 | 27 | 36 | 45 | 54 | 63 | 72 | 81 |
---|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
我想从每个数字中删除前导零,但我很难让它工作。这是功能代码的样子。
char * toHex(int n, int q){
static char hexNumber[4] = {0x00};
char digits[16]={ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
unsigned int un = q;
int i;
for(i=1; i>=0; i--){
hexNumber[i] = digits[un%n];
un=un/n;
}
if(strcmp(hexNumber, "0") == 0){
hexNumber = " ";
}
return hexNumber;
}
使用我的逻辑,我正在尝试将hexNumber字符串重新分配给一个空的“”字符串,这样就不会出现零,但是我收到了错误:
timesTable.c: In function ‘toHex’:
timesTable.c:68:13: error: incompatible types when assigning to type ‘char[4]’ from type ‘char *’
hexNumber = " ";
非常感谢任何帮助。
答案 0 :(得分:0)
您无法重新指定char[]
类型,也无法修改const char[]
。所以你必须这样做:
char hexNumber[4] = {0x00};
当你想分配时:
memcpy(hexNumber, " ", 2)
(如果您已导入strings.h)hexNumber[0] = ' '; hexNumber[1] = '\0';
(如果您不想导入任何内容)编辑:以上修复了错误。为了使您的程序正确,可能这就是您要用{<1}}代码替换
if(strcmp...
这将从字符串的开头检查0个字符,用空格字符替换它们,直到它达到非0字符。
如果您在堆栈中将其定义为数组,则也无法返回for (i = 0; i < 3; i++) {
if (hexNumber[i] == '0') {
hexNumber[i] = ' ';
} else {
break;
}
}
,而是hexNumber
然后char* hexNumber = malloc(4);
(确保您memset(hexNumber, '\0', 4)
最佳)。这会在堆而不是堆栈上分配它。无论调用此函数最终需要import <strings.h>
结果,否则您将有内存泄漏。或者,您可以使此函数接受free
作为输入,并使调用者按需要分配它,这是处理字符串的许多C库函数所做的事情。