/ *编写一个程序,按升序对数组中输入的名称进行排序* / 当我在数组中输入名称时程序停止。任何人都知道为什么?
#include<stdio.h>
#include<string.h>
void main(void)
{
/* write a program to sort names entered in an array in ascending order */
int in,out,i,x;
char temp[30],string2d[5][30];
printf("ENTER NAMES IN THE ARRAY:");
for(i=0;i<5 ;i++)
{
gets(string2d[i]);
}
for(out=0;out<5-1;out++)
{
for(in=out+1;out<5;in++)
{
x=strcmpi(string2d[out],string2d[in]);
if(x>1)
{
strcmpi(temp,string2d[out]);
strcmpi(string2d[out],string2d[in]);
strcmpi(string2d[in],temp);
}
}
}
for(i=0;i<5;i++)
{
puts(string2d[i]);
}
getch();
}
我已经看到了注释并对真实程序进行了更改,但程序仍然在循环和i之间循环
答案 0 :(得分:5)
实际上,问题似乎就行了
for(in=out+1;out<5;in++)
你递增,但检查out是否小于5.
答案 1 :(得分:1)
我怀疑无限循环:
for(in=out+1;out<5;in++)
{
x=strcmpi(string2d[out],string2d[in]);
if(x>1)
{
strcmpi(temp,string2d[out]);
strcmpi(string2d[out],string2d[in]);
strcmpi(string2d[in],temp);
}
}
您的循环条件out < 5
永远不会改变,我怀疑您的意思是in < 5
。
同样如前所述,您可能正在使用strcmpi
而不是strcpy
。
另外strcmp*
返回小于,等于或大于0
的整数,您的代码会将此值与1
进行比较
答案 2 :(得分:0)
我认为你的意思是strcpy
(或者更好,strncpy)。
strcmpi(temp,string2d[out]);
strcmpi(string2d[out],string2d[in]);
strcmpi(string2d[in],temp);
答案 3 :(得分:0)
你在哪里
strcmpi(temp,string2d[out]);
strcmpi(string2d[out],string2d[in]);
strcmpi(string2d[in],temp);
你可能意味着strcpy
答案 4 :(得分:0)
一些注意事项:
使用函数strcmpi
时,应检查返回值是否小于,等于或大于零,而不是1。
代码的最内部应该使用strncpy
而不是strcmpi
。当前的代码实际上没有做任何事情。
你的意思是什么意思“暂停”?它到底有多远?尝试在关键位置放置一些debug printf
语句(例如在输入循环之后和for循环的每次迭代开始时),以便更好地了解代码的哪些部分存在错误行为。
答案 5 :(得分:0)
如前所述,您的三个strcmpi
应该是副本。另请注意,如果第一个strcmpi
(右侧)为strcmp
,则您的x>1
始终为false,并且if永远不会执行。
答案 6 :(得分:0)
使用qsort(测试)的一种方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Changeable constants
const size_t MAX_LENGTH = 100;
const size_t N_NAMES = 10;
//Simple alias for lazy ones
typedef char String[MAX_LENGTH];
//fgets keeps the \n at the end of the
//returned string : this function removes it
void remove_end_rc(char * const string) {
size_t const len = strlen(string);
if(len && string[len-1] == '\n')
string[len-1] = '\0';
}
//Input function
void ask_names(String names[N_NAMES]) {
for(size_t i = 0 ; i < N_NAMES ; ++i) {
printf("Name %u ? ", i+1);
fgets(names[i], MAX_LENGTH, stdin);
remove_end_rc(names[i]);
}
}
//Output function
void print_names(String const names[N_NAMES]) {
printf("Sorted :\n");
for(size_t i = 0 ; i < N_NAMES ; ++i) {
printf("%u) %s\n", i+1, names[i]);
}
}
int alpha_cmp(void const *str1, void const *str2 ) {
return strcmp((char const*)str1,(char const*)str2);
}
int main(void) {
String names[N_NAMES] = {""};
ask_names(names);
//Sort alphabetically using strcmp
qsort(names, N_NAMES, MAX_LENGTH, alpha_cmp);
print_names(names);
return 0;
}
另一种没有qsort()的方法,使用bubble算法:
#include <stdio.h>
#include <string.h>
/** Types *************************************/
//Changeable constants
#define MAX_LENGTH 100
#define N_NAMES 10
//Simple aliases for lazy ones
typedef char String[MAX_LENGTH];
typedef String Names[N_NAMES];
/** Input/Output ******************************/
//fgets keeps the \n at the end of the
//returned string : this function removes it
void remove_end_rc(char * const string) {
size_t const len = strlen(string);
if(len && string[len-1] == '\n')
string[len-1] = '\0';
}
//Input function
void ask_names(Names names) {
for(size_t i = 0 ; i < N_NAMES ; ++i) {
printf("Name %u ? ", i+1);
fgets(names[i], MAX_LENGTH, stdin);
remove_end_rc(names[i]);
}
}
//Output function
void print_names(Names names) {
printf("Sorted :\n");
for(size_t i = 0 ; i < N_NAMES ; ++i) {
printf("%u) %s\n", i+1, names[i]);
}
}
/** Sorting *************************************/
//Explicit
void swap_str(String s1, String s2) {
String temp = "";
strcpy(temp, s1);
strcpy(s1, s2);
strcpy(s2, temp);
}
#include <stdbool.h>
//Sorts alphabetically using bubble algorithm
void alpha_sort(Names names)
{
bool swapped;
do {
swapped = false;
for(size_t i = 0 ; i < N_NAMES-1 ; ++i) {
if(strcmp(names[i], names[i+1])) {
swap_str(names[i], names[i+1]);
swapped = true;
}
}
}while(!swapped);
}
/** Main program **********************************/
int main(void) {
Names names = {""};
ask_names(names);
alpha_sort(names);
print_names(names);
return 0;
}
你可以通过处理案件(下层,上层),符号来改善它......但基本上它可以完成它的工作。