C 交换8个字母的字符数组。没有正确交换

C 交换8个字母的字符数组。没有正确交换,c,arrays,C,Arrays,我被要求编写一个程序,使用getchar()函数填充两个8个字母的数组。然后我被要求交换这两个数组 int main(void) { char arr1[8]; char arr2[8]; char c; int counter = 0; char hold[8]; printf("Please enter 8 characters (Array 1):\t"); while(counter < 8) {

我被要求编写一个程序,使用getchar()函数填充两个8个字母的数组。然后我被要求交换这两个数组

int main(void)
{
    char arr1[8];
    char arr2[8];
    char c;
    int counter = 0;
    char hold[8];


    printf("Please enter 8 characters (Array 1):\t");

    while(counter < 8)
    {
        c = getchar();
        arr1[counter] = c;
        counter++;
    }

    counter=0;

    printf("Please enter 8 characters (Array 2):\t");   

    while(counter < 8) 
    {
        c = getchar();
        arr2[counter] = c;
        counter++;
    }


    counter=1;

    while (counter !=9) 
    {
        printf("\n%c",arr1[counter-1]);
        printf("\t%c",arr2[counter]);
        counter++;
    }

    counter=0;

    while (counter!=8)
    {
        hold[counter] = arr1[counter];
        arr1[counter] = arr2[counter];
        arr2[counter] = hold[counter];
        counter++;

    }
    printf("\n\n\n");

    counter=1;

    while (counter !=9) 
    {
        printf("\n%c",arr1[counter-1]);
        printf("\t%c",arr2[counter]);
        counter++;
    }
    return 0;
}
int main(无效)
{
char-arr1[8];
char-arr2[8];
字符c;
int计数器=0;
charhold[8];
printf(“请输入8个字符(数组1):\t”);
while(计数器<8)
{
c=getchar();
arr1[计数器]=c;
计数器++;
}
计数器=0;
printf(“请输入8个字符(数组2):\t”);
while(计数器<8)
{
c=getchar();
arr2[计数器]=c;
计数器++;
}
计数器=1;
while(计数器!=9)
{
printf(“\n%c”,arr1[计数器-1]);
printf(“\t%c”,arr2[计数器]);
计数器++;
}
计数器=0;
while(计数器!=8)
{
保持[计数器]=arr1[计数器];
arr1[计数器]=arr2[计数器];
arr2[计数器]=保持[计数器];
计数器++;
}
printf(“\n\n\n”);
计数器=1;
while(计数器!=9)
{
printf(“\n%c”,arr1[计数器-1]);
printf(“\t%c”,arr2[计数器]);
计数器++;
}
返回0;
}
有人能告诉我我在交换阵列时有什么不对吗


编辑:我意识到这可能是我的第二次打印出错,而不是实际的阵列交换

交换代码没有问题,打印数组的方式存在一些问题:

int main(void)
{
    char arr1[8];
    char arr2[8];
    char c;
    int counter = 0;
    char hold[8];


    printf("Please enter 8 characters (Array 1):\t");

    while(counter < 8)
    {
        c = getchar();
        arr1[counter] = c;
        counter++;
    }

    counter=0;

    printf("Please enter 8 characters (Array 2):\t");   

    while(counter < 8) 
    {
        c = getchar();
        arr2[counter] = c;
        counter++;
    }


    counter=1;

    while (counter !=9) 
    {
        printf("\n%c",arr1[counter-1]);
        printf("\t%c",arr2[counter]);
        counter++;
    }

    counter=0;

    while (counter!=8)
    {
        hold[counter] = arr1[counter];
        arr1[counter] = arr2[counter];
        arr2[counter] = hold[counter];
        counter++;

    }
    printf("\n\n\n");

    counter=1;

    while (counter !=9) 
    {
        printf("\n%c",arr1[counter-1]);
        printf("\t%c",arr2[counter]);
        counter++;
    }
    return 0;
}
  while (counter !=9) 
  {
    printf("\n%c",arr1[counter-1]); // why -1?
    printf("\t%c",arr2[counter]); // will access array out of bounds (index 8)
    counter++;
  }
这是正确的方法:

  for(counter=0;counter<8;counter++)
  {
    printf("\n%c",arr1[counter]);
    printf("\t%c",arr2[counter]);
  }

正如所建议的,
for
循环比
更适合您的用例,而
循环

每个数组将只占用4个字符,因为您在读取字符后不会刷新stdin。此外,您的交换逻辑是错误的。您可以使用以下命令。而不是纠正交换逻辑

int main(void)
{
    char arr1[8 + 1] = {'\0'};
    char arr2[8 + 1] = {'\0'};
    char c;
    int counter = 0;

    printf("Please enter 8 characters (Array 1):\t");

    while(counter < 8)
    {
        c = getchar();
        arr1[counter++] = c;
        __fpurge(stdin);
    }
    arr1[counter] = '\0';

    counter=0;
    printf("Please enter 8 characters (Array 2):\t");   

    while(counter < 8) 
    {
        c = getchar();
        arr2[counter++] = c;
        __fpurge(stdin);
    }

    arr2[counter] = '\0';
    puts(arr1);
    puts(arr2);

    int i;
    for (i = 0; i < 8; i++) // This will do the swapping.
    {
        c = arr1[i];
        arr1[i] = arr2[i];
        arr2[i] = c;
    }

    puts(arr1);
    puts(arr2);

    return 0;
}
int main(无效)
{
字符arr1[8+1]={'\0'};
字符arr2[8+1]={'\0'};
字符c;
int计数器=0;
printf(“请输入8个字符(数组1):\t”);
while(计数器<8)
{
c=getchar();
arr1[counter++]=c;
__fpurge(stdin);
}
arr1[计数器]='\0';
计数器=0;
printf(“请输入8个字符(数组2):\t”);
while(计数器<8)
{
c=getchar();
arr2[counter++]=c;
__fpurge(stdin);
}
arr2[计数器]='\0';
puts(arr1);
puts(arr2);
int i;
对于(i=0;i<8;i++)//这将进行交换。
{
c=arr1[i];
arr1[i]=arr2[i];
arr2[i]=c;
}
puts(arr1);
puts(arr2);
返回0;
}

\uu fpurge(标准输入法)
用于在每次获取字符时刷新stdin缓冲区。否则,getchar()将换行符(Enter键)也作为一个字符,因此在这种情况下,您只能读取4个字符。你可以考虑终止一个字符为空的字符数组,为此,数组大小应该总是,你想要的大小+1。

你是否尝试调试程序?设置断点、单步、检查变量等?输入的输出是什么?仅仅说“它不起作用”并没有多大帮助。请用输入/输出编辑您的问题,并使其格式正确。使其更易于阅读。打印数组的循环看起来可疑。为什么arr1和arr2的指数不同?arr2中的第一个字符可能是以前输入的换行符吗?一般来说,没有理由使用
,而在这里,
for
会更安全。当我尝试将数组打印为arr1[counter]时,在q下面有一个\n,在secound数组中没有q。我对您刚才提供的编辑也有同样的问题。您在输入中按enter键了吗?对于getchar(),我按enter键了。还有别的办法吗?抱歉,如果这看起来很愚蠢,我只是在处理一点也不好的工作表
getchar()
读取一个字符,
enter
也是一个字符。输入字符时不能按enter键,也可以通过读取其他字符忽略enter键immediately@thumbmunkeys这是一次意外,我不知道如何移除它。如果你能做到,请继续。