我有一个家庭作业问题。我离计划很近。我有一件事遇到麻烦。这是个问题:
编写一个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执行它时,我无法正确地获得第一个反向,并且我想显示所有移位步骤。
答案 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次(作为不旋转/移位的替代方法)在所有)。我相信这对你来说应该是一件容易的事。