例如:char str = "frank ok has"
處理成:str = "ok has frank"
uj5u.com熱心網友回復:
先分割成字串陣列,然后按長度排序,最后再按排序后的順序連接字串uj5u.com熱心網友回復:
這不是很簡單嗎,先按空格分割(最后一個以結束符‘\0’為標識分割),然后strlen()按照大小排列一下就行。uj5u.com熱心網友回復:
哪位大神 幫我看看 當執行3的時候 報亂碼,是怎么回事?謝謝了。//cpp11.13.11
void menu() {
printf("=================================================\n");
printf("1.列印源字串列 2.ASCII順序列印\n");
printf("3.按長度遞增列印 4.按第一個單詞長度列印\n");
printf("5.退出\n");
printf("=================================================\n");
printf("請輸入選項:");
}
void remove_blank_char_only_save_one(char* s, char* ret) {
int m = 0;
int i;
for (i = 0; s[i] != '\0';) {
//注意判斷字符的空格要使用單引號' ',不能使用雙引號
if (s[i] == '\t') {
s[i] = ' ';
}
if (isblank(s[i])) {
ret[m] = s[i];
m++;
i++;
while (isblank(s[i])) {
i++;
}
}
else {
ret[m] = s[i];
m++;
i++;
}
}
ret[m] = '\0';
}
void remove_blank_on_start(char* s) {
if (s == NULL || *s == '\0')
{
return s;
}
int len = 0;
char* p = s;
while (*p != '\0' && isspace(*p))
{
++p;
++len;
}
memmove(s, p, strlen(s) - len + 1);
}
void remove_blank_on_end(char* s)
{
if (s == NULL || *s == '\0')
{
return s;
}
int len = strlen(s);
char* p = s + len - 1;
while (p >= s && isspace(*p))
{
*p = '\0';
--p;
}
}
int get_str_words_num(char* s, int n) {
for (int i = 0; i < strlen(s); i++) {
if (s[i] == ' ') {
n++;
}
}
return n + 1;
}
void sort_str_by_word_len(char* s, char(*des)[10], int num) {
int j = 0, i, k = 0;
char t[50];//臨時陣列,用于交換
for (int i = 0; i <= strlen(s); i++) {
if (s[i] != ' ') {
//以空格分割每個單詞,當遇到空格之前,把空格之前的字符存到一個二維陣列中
des[j][k++] = s[i];
}
else {
//當遇到空格時,添加第一個一維級陣列的結束標志,并將J加1開始第二一維陣列的賦值,并讓K的值歸0,從頭開始計算。
des[j][k] = '\0';
j++;
k = 0;
}
}
//使用冒泡法,根據二維陣列中各個一維陣列的長度進行排序
for (int m = 0; m < num; m++) {
for (int n = 0; n < num - m - 1; n++) {
if (strlen(des[n]) > strlen(des[n + 1])) {
strcpy(t, des[n]);
strcpy(des[n], des[n + 1]);
strcpy(des[n + 1], t);
}
}
}
}
void case2(char* s) {
//冒泡排序法
char temp;
char res[50];
strcpy(res, s);
for (int i = 0; i < strlen(res); i++) {
for (int j = 0; j < strlen(res) - i - 1; j++) {
if (res[j] > res[j + 1]) {
temp = res[j];
res[j] = res[j + 1];
res[j + 1] = temp;
}
}
}
printf("%s\n", res);
}
void case3(char *s) {
char dst[10][50];
char res[50];
int n_words = 0;
strcpy(res, s);
char* temp = res;
remove_blank_char_only_save_one(s, temp);
remove_blank_on_start(temp);
remove_blank_on_end(temp);
n_words = get_str_words_num(temp, n_words);
sort_str_by_word_len(temp, dst, n_words);
for (int i = 0; i < n_words; i++) {
printf("%s ", dst[i]);
}
printf("\n");
}
void myprint(char* s) {
int num;
menu();
while (scanf("%d", &num) == 1) {
switch (num) {
case 1:
printf("%s\n", s);
break;
case 2:
case2(s);
break;
case 3:
case3(s);
break;
case 4:
break;
case 5:
printf("bye!");
return;
default:
printf("請輸入正確的選項!\n");
break;
}
menu();
}
}
void cpp11_13_11() {
char ch;
char str[50];
int i = 0;
printf("please input 10 char:\n");
while (i < 49) {
ch = getchar();
str[i] = ch;
if ((str[i] == '\n') && (str[i - 1] == '\n')) {
break;
}
i++;
}
str[i] = '\0';
setbuf(stdin, NULL);
myprint(str);
}
uj5u.com熱心網友回復:
先得到每一個單詞,然后再按照字串長度排序~uj5u.com熱心網友回復:
代碼的問題是 區域變數在函式呼叫完后自動釋放了,資料不能回傳,改成全域變數可以解決,小白的我是靠單步除錯發現的問題。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/74468.html
標籤:C語言
上一篇:C++多型性的一個小問題
下一篇:我編的一個小程式怎么沒輸出?程式功能:要求寫三個函式,一個用來輸入10個整數,一個理這組數,一個輸出處理后的數。將最小的數和第一個數換,最大的和最后一個調換
