Skip to content

Instantly share code, notes, and snippets.

@pythoncat1024
Last active September 4, 2022 09:46
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pythoncat1024/6772d5ac17360774bb24f9c95787eae8 to your computer and use it in GitHub Desktop.
Save pythoncat1024/6772d5ac17360774bb24f9c95787eae8 to your computer and use it in GitHub Desktop.
字符串数组作为实参以及形参的表示
#include <stdio.h>
#include <string.h>
// #include "../include/utils.h"
#define ROW 5
#define LENGTH 40
int menu();
void inputs(char *arr[], int row);
void prints(char *arr[], int row);
void sort_by_ascii(char *arr[], int row);
void sort_by_length(char *arr[], int row);
char **sort_by_first(char *arr[], int row);
char * s_gets(char * str, int n)
{
char * ptr = fgets(str, n, stdin);
// 如果是空行,返回值统一处理
if( '\n' == *ptr )
ptr = NULL;
else
for(int i = 0; i < n; i++)
{
if(*(ptr + i) == '\0')
{
break;
}
else if(*(ptr + i) == '\n')
{
*(ptr + i) = '\0';
break;
}
}
return ptr;
}
void call(int row, int col, char arr[row][col]) {
printf("call start=====\n");
for (int i = 0; i < row; ++i) {
printf("%s\t", arr[i]);
}
printf("\ncall end=======\n");
}
int main(int argc, char *argv[]) {
char arr[ROW][LENGTH];
char *ptr[ROW];
for (int i = 0; i < ROW; ++i) {
// 必须要这一步,否则排序就比较麻烦
ptr[i] = arr[i];
}
inputs(ptr, ROW);
call(ROW, LENGTH, arr);
while (1) {
int select = menu();
char **s;
switch (select) {
case 1:
prints(ptr, ROW);
break;
case 2:
sort_by_ascii(ptr, ROW);
prints(ptr, ROW);
break;
case 3:
sort_by_length(ptr, ROW);
prints(ptr, ROW);
break;
case 4:
s = sort_by_first(ptr, ROW);
printf("return============================%s\n", s[0]);
prints(ptr, ROW);
break;
default:
printf("%d is a invalid selection!\n", select);
break;
}
if (select > 4 || select < 1)
break;
}
return 0;
}
void sort_by_ascii(char *arr[], int row) {
for (int i = 0; i < row - 1; i++) {
for (int j = 0; j < row - 1 - i; j++) {
if (strcmp(arr[j], arr[j + 1])) {
char *tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void sort_by_length(char *arr[], int row) {
for (int i = 0; i < row - 1; i++) {
for (int j = 0; j < row - 1 - i; j++) {
if (strlen(arr[j]) < strlen(arr[j + 1])) {
char *tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
char **sort_by_first(char *arr[], int row) {
for (int i = 0; i < row - 1; i++) {
for (int j = 0; j < row - 1 - i; j++) {
if (*arr[j] > *arr[j + 1]) {
char *tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
return arr;
}
void prints(char *arr[], int row) {
for (int i = 0; i < row; i++) {
puts(arr[i]);
}
}
void inputs(char *arr[], int row) {
printf("please input %d lines:\n", row);
for (int i = 0; i < row; ++i) {
s_gets(arr[i], LENGTH);
}
}
int menu() {
puts("############# SELECT MENU ##################");
puts("1. print by origin 2. print by ascii");
puts("3. print by len 4. print by first");
int selected;
int ch;
while ((1 != scanf("%d", &selected))) {
while ((ch = getchar()) != '\n')
putchar(ch);
printf(" is not valid menu. please input number[1,4] again:\n");
}
return selected;
}
@LGFHD
Copy link

LGFHD commented Sep 3, 2022

#include "../include/utils.h"
这个头文件怎么找不到,您能告知一下在哪吗

@pythoncat1024
Copy link
Author

@LGFHD 感谢提醒。这个 gist 我本地还没有编译过。对应这里面只有一个函数 s_gets() 是来自于 utils.h 的,我直接把这个函数加到 main.c 里面了。验证可以编译运行了。重新下载这个main.c 即可。

@LGFHD
Copy link

LGFHD commented Sep 4, 2022

void call(int row, int col, char arr[row][col])
我用VS编译显示 E0411:不允许使用参数,(row和col)

@pythoncat1024
Copy link
Author

#include <stdio.h>
#include <string.h>

// #include "../include/utils.h"

#define ROW 5
#define LENGTH 40

int menu();

void inputs(char *arr[], int row);

void prints(char *arr[], int row);

void sort_by_ascii(char *arr[], int row);

void sort_by_length(char *arr[], int row);

char **sort_by_first(char *arr[], int row);

char * s_gets(char * str, int n)
{
    char * ptr = fgets(str, n, stdin);
    // 如果是空行,返回值统一处理
    if( '\n' == *ptr )
        ptr = NULL;
    else
        for(int i = 0; i < n; i++)
        {
            if(*(ptr + i) == '\0')
            {
                break;
            }
            else if(*(ptr + i) == '\n')
            {
                *(ptr + i) = '\0';
                break;
            }
        }
    return ptr;

}

void call(int row, int col, char **arr) {
    printf("call start=====\n");
    for (int i = 0; i < row; ++i) {
        printf("%s\t", arr[i]);
    }
    printf("\ncall end=======\n");
}

int main(int argc, char *argv[]) {
    char arr[ROW][LENGTH];
    char *ptr[ROW];
    char *origin[ROW];
    for (int i = 0; i < ROW; ++i) {
        // 必须要这一步,否则排序就比较麻烦
        ptr[i] = arr[i];
        origin[i] = arr[i];
    }

    inputs(ptr, ROW);
    call(ROW, LENGTH, ptr);
    while (1) {
        int select = menu();
        char **s;
        switch (select) {
            case 1:
                prints(origin, ROW);
                break;
            case 2:
                sort_by_ascii(ptr, ROW);
                prints(ptr, ROW);
                break;
            case 3:
                sort_by_length(ptr, ROW);
                prints(ptr, ROW);
                break;
            case 4:
                s = sort_by_first(ptr, ROW);
                printf("return============================%s\n", s[0]);
                prints(ptr, ROW);
                break;
            default:
                printf("%d is a invalid selection!\n", select);
                break;
        }
        if (select > 4 || select < 1)
            break;
    }
    return 0;
}

void sort_by_ascii(char *arr[], int row) {
    for (int i = 0; i < row - 1; i++) {
        for (int j = 0; j < row - 1 - i; j++) {
            if (strcmp(arr[j], arr[j + 1])) {
                char *tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}

void sort_by_length(char *arr[], int row) {
    for (int i = 0; i < row - 1; i++) {
        for (int j = 0; j < row - 1 - i; j++) {
            if (strlen(arr[j]) < strlen(arr[j + 1])) {
                char *tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}

char **sort_by_first(char *arr[], int row) {
    for (int i = 0; i < row - 1; i++) {
        for (int j = 0; j < row - 1 - i; j++) {
            if (*arr[j] > *arr[j + 1]) {
                char *tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
    return arr;
}


void prints(char *arr[], int row) {
    for (int i = 0; i < row; i++) {
        puts(arr[i]);
    }
}

void inputs(char *arr[], int row) {
    printf("please input %d lines:\n", row);
    for (int i = 0; i < row; ++i) {
        s_gets(arr[i], LENGTH);
    }
}

int menu() {
    puts("############# SELECT MENU ##################");
    puts("1. print by origin    2. print by ascii");
    puts("3. print by len       4. print by first");
    int selected;
    int ch;
    while ((1 != scanf("%d", &selected))) {
        while ((ch = getchar()) != '\n')
            putchar(ch);
        printf(" is not valid menu. please input number[1,4] again:\n");
    }
    return selected;
}

用这个看看。可能部分编译器不支持使用 char arr[row][col] 这种格式的参数。 上面这个如果还是编译失败,换成 void call(int row, int col, char *arr[]) .

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment