例如-如果我的字符串是-“Friend 32 Hello 12” 我的输出应该是 - “你好 12 friend 32”
#include <stdio.h>
#include <string.h>
int main(void) {
char a[100][100],temp[100];
int i,j,c;
for(i=0;i<100;i++)
{
scanf("%s",a[i]);
if(i%2==0)
{
for(j=0;j<100;j++)
{
if(isupper(a[i][j]))
a[i][j]=a[i][j]+32;
}
}
}
for(i=0;i<100;i++)
{
printf("%s",a[i]);
printf("\n");
}
for(i=0;i<99;i=i+2)
{
for(j=i+2;j<100;j=j+2)
{
c=strcmp(a[i],a[j]);
if(c>0)
{
*temp=*a[i];
*a[i]=*a[j];
*a[j]=*temp;
}
}
}
for(i=0;i<100;i=i+2)
{
printf("%s",a[i]);
}
return 0;
}
我不明白我的代码哪里错了。它正在打印一些垃圾值。 我正在使用选择排序算法。
最佳答案
你想根据数字对 50 对字符串和数字进行排序。为此,您定义了一个包含 100 个字符串的数组。我建议您将数据表示为两个包含 50 个整数和 50 个字符串的数组。 (这只是第一个想法,请参阅下文以获得更好的建议。)
C 中的字符串实际上是末尾有空字节的字符数组。您不能将数组相互分配,但可以复制它们的内容。如果你想交换字符串,你必须复制实际的字符。函数strcpy
来自<string.h>
为你而死。
对数组进行排序时,您仅对一个数组进行比较,但同时交换两个数组。数字交换是直接的,字符串交换需要深度复制 strcpy
.
这是初稿:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define N 50
#define MAXLEN 40
int main(void)
{
char str[N][MAXLEN];
int num[N];
int i, j;
for (i = 0; i < N; i++) {
if (scanf("%s%d", str[i], &num[i]) != 2) {
fprintf(stderr, "Wrong input format!");
exit(1);
}
for (j = 0; str[i][j] != '\0'; j++) {
str[i][j] = tolower(str[i][j]);
}
}
for (i = 0; i < N; i++) {
printf("%s %d\n", str[i], num[i]);
}
for (i = 0; i < N; i++) {
for (j = i + 1; j < N; j++) {
if (num[i] > num[j]) {
int tnum;
char tstr[MAXLEN];
tnum = num[i];
num[i] = num[j];
num[j] = tnum;
strcpy(tstr, str[i]);
strcpy(str[i], str[j]);
strcpy(str[j], tstr);
}
}
}
puts("--");
for (i = 0; i < N; i++) {
printf("%s %d\n", str[i], num[i]);
}
return 0;
}
当您必须将事物放在一起时,通常的方法是将它们打包到一个结构中。然后,您可以移动整个结构,而不必担心字符串和数字不同步。
结构体之间可以互相赋值;然后复制它们的内容。这使得交换更容易。另一个优点是结构体可以使用标准排序例程 qsort
进行排序。来自<stdlib.h>
.
所以让我们这样做:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define N 50
#define MAXLEN 40
struct pair_t {
char str[MAXLEN];
int num;
};
int main(void)
{
struct pair_t pair[N];
int i, j;
for (i = 0; i < N; i++) {
if (scanf("%s%d", pair[i].str, &pair[i].num) != 2) {
fprintf(stderr, "Wrong input format!");
exit(1);
}
for (j = 0; pair[i].str[j] != '\0'; j++) {
pair[i].str[j] = tolower(pair[i].str[j]);
}
}
for (i = 0; i < N; i++) {
printf("%s %d\n", pair[i].str, pair[i].num);
}
for (i = 0; i < N; i++) {
for (j = i + 1; j < N; j++) {
if (pair[i].num > pair[j].num) {
struct pair_t tmp;
tmp = pair[i];
pair[i] = pair[j];
pair[j] = tmp;
}
}
}
puts("--");
for (i = 0; i < N; i++) {
printf("%s %d\n", pair[i].str, pair[i].num);
}
return 0;
}
最后 - 但这是一个更高级的主题 - 如果您的结构很长,您最终会交换大量字节,这不是很有效。您可以创建一个指向您的对的指针数组,然后对指针进行排序并保留原始数组。
关于c - 在 C 中对具有交替位置的单词和数字的字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32242143/