Last active
September 4, 2022 09:46
-
-
Save pythoncat1024/6772d5ac17360774bb24f9c95787eae8 to your computer and use it in GitHub Desktop.
字符串数组作为实参以及形参的表示
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 感谢提醒。这个 gist 我本地还没有编译过。对应这里面只有一个函数 s_gets()
是来自于 utils.h
的,我直接把这个函数加到 main.c
里面了。验证可以编译运行了。重新下载这个main.c
即可。
void call(int row, int col, char arr[row][col])
我用VS编译显示 E0411:不允许使用参数,(row和col)
#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
#include "../include/utils.h"
这个头文件怎么找不到,您能告知一下在哪吗