逐个移动数组元素

时间:2014-12-11 16:19:09

标签: c arrays

我有一个家庭作业问题。我离计划很近。我有一件事遇到麻烦。这是个问题:

  

编写一个C程序,生成并显示一个大小为10的字符数组   随机英文小写字母。程序然后询问用户该阵列的次数   将右移并在每个右移步骤显示右移阵列。一个样品   程序执行输出如下。 (提示:使用英文小写的ASCII码   a,b,...,z分别为97,98,... 122的字母,用于生成字符数组。)

这是我的代码:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

void print_string (char *string){
 int i;
 for (i=0 ; i < 10 ; i ++){
    printf("%c ", string[i]);
    if (i == 9)
     printf("\n");
  }

} 
void random_string(char *string, unsigned length)
{
  /* Seed number for rand() */
  srand((unsigned int) time(0) + getpid());

  /* ASCII characters 97 to 122 */
  int i;  
  for (i = 0; i < length; ++i)
    {
      string[i] = (rand() % 26)+ 97;
    }

  string[i] = '\0';  
}

void reverse_string(char* str, int left, int right) {
  char* p1 = str + left;
  char* p2 = str + right;
  while (p1 < p2) {
    char temp = *p1;
    *p1 = *p2;
    *p2 = temp;
    p1++;
    p2--;

  }
}

void rotate(char* str, int k, int n) {

  reverse_string(str, 0, n-1);
  reverse_string(str, 0, k-1);
  reverse_string(str, k, n-1);

}

int main(void)
{
  char s[11];
  int i,shiftNum;

  random_string(s, 11);
  printf("Randomly constructed array is :\n");

  print_string(s);

  printf("Enter how many times array will be shifted: ");
  scanf("%d",&shiftNum);

  rotate(s,shiftNum,11);
  print_string(s);

}

这段代码有什么问题?当我用1执行它时,我无法正确地获得第一个反向,并且我想显示所有移位步骤。

1 个答案:

答案 0 :(得分:1)

首先,您的讲师/教授告诉您使用97..122是非常残忍的。 C不要求ASCII是每个系统上的字符集,所以这段代码完全是不可移植的,但是如果你看一下Unix的历史,C应该是一种可移植的编程语言。如果要以可移植的方式编写它,则需要将字符存储在数组中并从该数组中选择:

char lowercase[] = "abcdefghijklmnopqrstuvwxyz";
string[i] = lowercase[rand() % (sizeof lowercase - 1)];

现在我们已经涵盖了这个迂腐细节,Cool Guy indicated in a comment这行代码是错误的:string[i] = '\0';。他是对的。

这也应该在main内执行,而不是在random_string srand((unsigned int) time(0) + getpid());内执行。原因是在同一秒内多次调用random_string会产生相同的&#34;随机字符串&#34;,这非常不酷。

scanf("%d",&shiftNum);无法保证成功(用户将输入数字数据),因此无法保证shiftNum将包含合理的值。您需要检查返回值。例如:

if (scanf("%d", &shiftNum) != 1) {
    puts("Invalid shift count!\n");
    exit(0);
}

您还应考虑为shiftNum使用无符号类型(这会导致相应的格式规范%d更改为其他内容,例如%u unsigned int })。

完成此任务之前的一项更重要的任务:您需要修改rotate以正确处理0的输入,因为某些用户可能想要旋转/移位0次(作为不旋转/移位的替代方法)在所有)。我相信这对你来说应该是一件容易的事。