试图反转数组中的多个整数 - 想知道为什么我的代码不起作用

时间:2017-11-04 18:24:05

标签: c arrays

可能在这里制作了一些非常破碎/效率低下的代码,但到目前为止,我一直试图从头开始构建它。

我在这段代码中尝试做的是让用户输入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链接中,谢谢!

1 个答案:

答案 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字符可能有问题,因为2123#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