這是我撰寫的程式中的主要功能,我需要在其中對字符陣列進行排序,使這些字符在開頭具有偶數的 ascii 代碼,并且我想顯示每次迭代時陣列的排序方式。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main ()
{
int n, i,j;
char echange;
printf("array size : ");
scanf("%d", &n);
char t[n];
for (i=0; i<n; i )
{
printf("enter array elements : ");
scanf(" %c", &t[i]);
}
for (j=0; j<n; j )
for (i=0; i<n; i )
{
if ((t[i] % 2!=0) && (t[i 1] % 2 ==0) && (i != n-1))
{
strcpy(echange, t[i]);
strcpy(t[i], t[i 1]);
strcpy(t[i 1], echange);
printf (" %c (%d)", t[i], t[i]);
}
else
printf(" %c (%d)", &t[i], t[i]);
}
}
這個問題通常被編譯,但輸出很奇怪:
array size : 3
enter array elements : d
enter array elements : f
enter array elements : g
2 └ (100) ┴ (102) ┬ (103) └ (100) ┴ (102) ┬ (103) └ (100) ┴ (102) ┬ (103)
Process returned 0 (0x0) execution time : 4.063 s
Press any key to continue.
那么我的代碼有什么問題?以及為什么如何使用帶有單個字符的 strcpy ?順便說一下,我試過沒有 strcpy 函式:
echange = t[i];
t[i] = t[i 1];
t[i 1] = echange;
它也不起作用
uj5u.com熱心網友回復:
該strcpy函式用于將空終止字串從一個char陣列復制到另一個陣列。您正在做的是復制單個字符,因此您將無效引數傳遞給函式,從而觸發未定義行為。
對于單個字符,您可以直接分配給它們。
echange = t[i];
t[i] = t[i 1];
t[i 1] = echange;
uj5u.com熱心網友回復:
對于初學者來說,if 陳述句中的這個條件:
if ((t[i] % 2!=0) && (t[i 1] % 2 ==0) && (i != n-1))
當i等于時可以呼叫未定義的行為,n- 1因為運算式 t[i 1] 可以有一個陷阱值。你至少需要這樣寫:
if ( ( i != n - 1 ) && (t[i] % 2!=0) && (t[i 1] % 2 ==0) )
使用strcpy需要指向字串的指標型別引數的函式
char *strcpy(char * restrict s1, const char * restrict s2);
with 型別的物件char呼叫未定義的行為。
而不是這些函式呼叫:
strcpy(echange, t[i]);
strcpy(t[i], t[i 1]);
strcpy(t[i 1], echange);
你可以寫:
echange = t[i];
t[i] = t[i 1];
t[i 1] = echange;
交換兩個字符。
據我了解,您需要將其拆分為兩個磁區,而不是對字符陣列進行排序。
如果您確實想要對陣列進行排序,那么您可以使用標準 C 函式qsort,而不是嘗試自己撰寫冒泡排序方法,如下面的演示程式所示。
#include <stdio.h>
#include <stdlib.h>
int cmp( const void *p1, const void *p2 )
{
unsigned char c1 = *( const unsigned char * )p1;
unsigned char c2 = *( const unsigned char * )p2;
return c1 % 2 == c2 % 2 ? c1 - c2
: c1 % 2 - c2 % 2;
}
int main( void )
{
enum { N = 10 };
char s[N] = "9876543210";
printf( "%.*s\n", N, s );
qsort( s, N, sizeof( char ), cmp );
printf( "%.*s\n", N, s );
}
程式輸出是
9876543210
0246813579
如果你想使用冒泡排序方法并在每次迭代后輸出陣列,那么實作該方法的函式可以如下所示,如下面的演示程式所示:
#include <stdio.h>
void bubble_sort( char *s, size_t n )
{
const int N = n;
for ( size_t last = 0; !( n < 2 ); n = last )
{
for ( size_t j = last = 1; j < n; j )
{
unsigned char c1 = s[j-1], c2 = s[j];
if ( ( c1 % 2 == c2 % 2 && c2 < c1 ) ||
( c2 % 2 < c1 % 2 ) )
{
char tmp = s[j];
s[j] = s[j-1];
s[j-1] = tmp;
last = j;
}
}
printf( "%.*s\n", N, s );
}
}
int main( void )
{
enum { N = 10 };
char s[N] = "9876543210";
printf( "%.*s\n\n", N, s );
bubble_sort( s, N );
printf( "\n%.*s\n", N, s );
}
程式輸出為:
9876543210
8765432109
8654321079
6843210579
6482103579
4628013579
4260813579
2406813579
2046813579
0246813579
0246813579
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381709.html
下一篇:C#LINQ從字串陣列串列中選擇
