我可能在这里制作了一些非常破碎/效率低下的代码,但到目前为止,我一直试图从头开始构建它。
我在这段代码中尝试做的是让用户输入8个整数,然后反转它们。
意思是如果用户输入12 21 32 43 54 43 23 54
,程序将输出45 32 34 45 34 23 12 21
。
这是我所做的代码:
#include <stdio.h>
#include <string.h>
int main(void){
int input[8];
char code[20][8];
char rev[20][8];
char pos[3];
for(int i = 0; i < 8; i++){
int j = i+1;
if(j==1){
strncpy(pos, "st", 3);
}
else if(j==2){
strncpy(pos, "nd", 3);
}
else if(j==3){
strncpy(pos, "rd", 3);
}
else{
strncpy(pos, "th", 3);
}
printf("Enter the %d%s integer : ",i+1,pos);
scanf("%d", &input[i]);
sprintf(code[i],"%d",input[i]);
}
for(int i = 0; i < 8; i++){
for(int j = 0; j < sizeof(code[i]);j++){
rev[i][sizeof(code[i]-j)] = code[i][j];
}
}
printf("NORMAL OUTPUT \t\t:");
for(int i = 7; i >= 0;i--){
for(int j = 0; j < sizeof(rev[i]);j++){
printf("%c",rev[i][j]);
}
printf(" ");
}
printf("\n");
printf("NON-REVERSE OUTPUT \t:");
for(int i = 7; i >= 0;i--){
for(int j = 0; j < sizeof(code[i]);j++){
printf("%c",code[i][j]);
}
printf(" ");
}
printf("\n");
printf("INTEGER OUTPUT \t\t:");
for(int i = 7; i >= 0;i--){
printf("%d",input[i]);
printf(" ");
}
printf("\n");
}
它有一些毛病,还有一些调试代码可以帮助我查看问题所在,但到目前为止它还没有多大帮助。
问题是这个。每当我尝试输出整数数组(如INTEGER OUTPUT块所示)时,它就会完美地显示它。
每当我输出字符数组&#39;代码&#39; (如NON-REVERSE OUTPUT块所示),它显示与整数数组相同的ALMOST,但是,它有一些小故障。
最差输出是反向数组(如NORMAL OUTPUT块所示),基本上是一个断字符串。
以下是三个输出示例:
尝试1,使用一位数字:
Enter the 1st integer : 1
Enter the 2nd integer : 2
Enter the 3rd integer : 3
Enter the 4th integer : 4
Enter the 5th integer : 5
Enter the 6th integer : 6
Enter the 7th integer : 7
Enter the 8th integer : 8
NORMAL OUTPUT : ÿ²þ
NON-REVERSE OUTPUT :8wÙz 7 6 5 4wÙz 3 2 1
INTEGER OUTPUT :8 7 6 5 4 3 2 1
尝试2,使用4位整数:
Enter the 1st integer : 1234
Enter the 2nd integer : 1234
Enter the 3rd integer : 1234
Enter the 4th integer : 1234
Enter the 5th integer : 1234
Enter the 6th integer : 1234
Enter the 7th integer : 1234
Enter the 8th integer : 1234
NORMAL OUTPUT : ¤Aÿ
NON-REVERSE OUTPUT :1234 1234 1234 1234 1234 1234 1234 1234
INTEGER OUTPUT :1234 1234 1234 1234 1234 1234 1234 1234
尝试3,使用8位整数:
Enter the 1st integer : 12345678
Enter the 2nd integer : 12345678
Enter the 3rd integer : 12345678
Enter the 4th integer : 12345678
Enter the 5th integer : 12345678
Enter the 6th integer : 12345678
Enter the 7th integer : 12345678
Enter the 8th integer : 12345678
NORMAL OUTPUT :8 8 8 8 8 8®ßôý 8
NON-REVERSE OUTPUT :12345678 12345678 12345678 12345678 12345678 12345678 12345678 12345678
INTEGER OUTPUT :12345678 12345678 12345678 12345678 12345678 12345678 12345678 12345678
整数中的数字越多,非反转输出的毛刺越少,但正常输出始终被破坏。除非问题与地址相关,否则我不知道是什么原因造成的。
我知道可能有更简单的方法来反转多个整数或字符串,但我的主要希望是找出这段代码到底出了什么问题,无论是整个结构/策略是什么&#39 ;有缺陷的,或者我是否忘记了解某些事情。
对于这篇文章的篇幅很抱歉,我只是想把所有信息都放在那里,以防万一需要,或者别人需要帮助。
UPDATE1:有人建议我使用strlen而不是sizeof,并在声明数组时将8更改为9,并且它稍微有效。
使用相同的输入,此处的尝试与以前相同:
尝试1:
NORMAL OUTPUT : 2Øp h1°ü
NON-REVERSE OUTPUT :8 7 6 5 4 3 2 1
INTEGER OUTPUT :8 7 6 5 4 3 2 1
尝试2:
NORMAL OUTPUT :234 4 4 4 4µê12 34Ýæ1
NON-REVERSE OUTPUT :1234 1234 1234 1234 1234 1234 1234 1234
INTEGER OUTPUT :1234 1234 1234 1234 1234 1234 1234 1234
尝试3:
NORMAL OUTPUT :2345678 2345678 2345678ý12345678 2345678 2345678 2345678 2345678 6785ý
NON-REVERSE OUTPUT :12345678 12345678 12345678 12345678 12345678 12345678 12345678 12345678
INTEGER OUTPUT :12345678 12345678 12345678 12345678 12345678 12345678 12345678 12345678
正常输出的问题仍然存在,反过来像往常一样破坏,除了最后一个看起来虽然没有逆转,但至少有实际数字。
代码的所有更新都将在此处显示为btw:ReverseInteger.c
万一有人想要更新!
UPDATE2 :正如BLUEPIXY在评论中所说,我需要为空终结符留出空间。 strlen
计算空终止符,所以基本上当我到达块反转整数时,它覆盖了空终止符,打破了整个字符串。
除此之外,我还必须初始化我正在反转的2D数组,这可以通过将其设置为{{0}}来完成。我的要点是,对于每个维度,您必须再添加一个{}。
固定代码在gist链接中,谢谢!
答案 0 :(得分:1)
我玩了github的最终代码并发现它可以简化。 char rev[20][9]
完全不需要char code[20][9]
。
另外,我认为char code[8][20]
应该是\0
。字符串形式的8个数字,长度为19位(#include <stdio.h>
#include <string.h>
int main(void){
int input[8];
char code[8][20];
char pos[3];
for(int i = 0; i < 8; i++){
int j = i+1;
if(j==1){
strncpy(pos, "st", 3);
}
else if(j==2){
strncpy(pos, "nd", 3);
}
else if(j==3){
strncpy(pos, "rd", 3);
}
else{
strncpy(pos, "th", 3);
}
printf("Enter the %d%s integer : ",i+1,pos);
scanf("%d", &input[i]);
sprintf(code[i],"%d",input[i]);
}
printf("REVERSED OUTPUT \t\t:");
// Just reads strings from the code[] in the reverse order
// so, using the additional array rev[] doesn't needed.
for(int i = 7; i >= 0; i--){
for(int j = strlen(code[i]) - 1; j >= 0; j--){
printf("%c", code[i][j]);
}
printf(" ");
}
puts("");
}
字符的第20个项目。)
12
注意:打印输入的数字为ascii字符可能有问题,因为21
,23
,#include <stdio.h>
int main() {
int size = 8;
int i, j;
int arr[size];
char *ending_arr[4] = {"st", "nd", "rd", "th"};
char *ending;
for(i = 0; i < size; i++) {
if(i < 3)
ending = ending_arr[i];
else
ending = ending_arr[3];
printf("Enter the %d%s integer : ", i + 1, ending);
scanf("%d", arr + i);
}
puts("");
printf("Original array:\t");
for(i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
puts("");
printf("Reversed array:\t");
for(i = size - 1; i >= 0; i--) {
while(arr[i]) {
printf("%d", arr[i] % 10);
arr[i] /= 10;
}
printf(" ");
}
puts("");
return 0;
}
是ascii中的非打印字符因此,表格可能会发生不可读的字符串。
Original array: 12 21 32 43 54 43 23 54
Reversed array: 45 32 34 45 34 23 12 21
<强>输出强>
df.reset_index().groupby("id")["index"].first()
id
1 0
2 2
3 7
4 13