#include<stdio.h> #include<string.h> int main() { void sort(const char *name[], int n); void print(const char** name[], int n); const char* name[] = { "Follow me","BASIC","Great Wall","FORTRAN","Computer design" }; int n = 5; sort(name, n); print(*name, n); return 0; } void sort(const char* name[], int n) { const char* temp; int i, j, k; for (i = 0; i < n - 1; i++) { k = i; for (j = i + 1; j < n; j++) if (strcmp(name[k], name[j]) > 0)k = j; if(k!=i) { temp = name[i]; name[i] = name[k]; name[k] = temp; } } } void print(const char **name, int n) { int i; for (i = 0; i < n; i++) printf("%s \n", name[i]); }
时间: 2024-03-21 07:42:38 浏览: 21
在调用print函数时,应该传递字符串数组的地址,而不是指向字符串数组的指针的地址。因此,修改后的main函数调用print函数的语句应该为:
```
print(&name, n);
```
同时,在print函数中,应该使用指向指针数组的指针,修改后的print函数如下:
```
void print(const char ***name, int n) {
int i;
for (i = 0; i < n; i++)
printf("%s \n", (*name)[i]);
}
```
这样修改之后,程序就能够正确地编译和运行了。
相关问题
定义一个包含5个教师成员的结构体数组,教师信息包括职工号、姓名和工资。要求从键盘输入所有教师的信息,并设计一个sort函数实现结构体数组按教师工资由少到多排序。目前,已编辑完成main函数,请编程实现input函数、output函数和sort函数,分别实现教师信息的录入、输出与排序。 /* @Filename: ex701.c @Author: Ju Chengdong @Version: 1.0 @Date: 2021-03-18 @Description: Salary Management System */ #include <stdio.h> #include <string.h> typedef struct teacher{ int id; // 职工号 char name[100]; // 姓名 int salary; // 工资 }teacher; const int NUM = 5; int main(){ void input(teacher *t, int n); void output(teacher *t, int n); void sort(teacher *t, int n); teacher t[NUM]; //教师数组 teacher *pt = t; input(pt, NUM); //为教师数组元素赋值 printf("Before sorting:\n"); output(pt, NUM); //排序前输出 sort(pt, NUM); //按工资排序 printf("After sorting:\n"); output(pt, NUM); //排序后输出 return 0; }
好的,以下是实现代码:
```c
#include <stdio.h>
#include <string.h>
typedef struct teacher {
int id; // 职工号
char name[100]; // 姓名
int salary; // 工资
} teacher;
void input(teacher *t, int n) {
for(int i = 0; i < n; i++) {
printf("请输入第%d个教师的职工号、姓名和工资(用空格分开):", i+1);
scanf("%d %s %d", &(t+i)->id, (t+i)->name, &(t+i)->salary);
}
}
void output(teacher *t, int n) {
printf("职工号\t姓名\t工资\n");
for(int i = 0; i < n; i++) {
printf("%d\t%s\t%d\n", (t+i)->id, (t+i)->name, (t+i)->salary);
}
}
void sort(teacher *t, int n) {
teacher temp;
for(int i = 0; i < n-1; i++) {
for(int j = 0; j < n-i-1; j++) {
if((t+j)->salary > (t+j+1)->salary) {
temp = *(t+j);
*(t+j) = *(t+j+1);
*(t+j+1) = temp;
}
}
}
}
int main() {
teacher t[NUM]; //教师数组
teacher *pt = t;
input(pt, NUM); //为教师数组元素赋值
printf("Before sorting:\n");
output(pt, NUM); //排序前输出
sort(pt, NUM); //按工资排序
printf("After sorting:\n");
output(pt, NUM); //排序后输出
return 0;
}
```
在这个代码中,我们同样定义了一个结构体`teacher`,包含了三个成员变量:职工号、姓名和工资。然后我们输入了所有教师的信息,并将其存储在一个结构体数组中。最后,我们使用冒泡排序对结构体数组进行排序,排序的方式是按照教师工资由少到多排序。最后,我们输出排序后的结果。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <jansson.h> #include <ctype.h> #include <openssl/hmac.h> typedef struct { char key[256]; char value[256]; } KeyValue; int compare(const void a, const void b) { return strcmp(((KeyValue)a)->key, ((KeyValue)b)->key); } // 将KeyValue数组按ASCII码升序排序并拼接成URL键值对形式的字符串 char *sort_dict(KeyValue *array, int size) { // 对KeyValue数组按ASCII码升序排序 qsort(array, size, sizeof(KeyValue), compare); // 初始化一个字符串,用于存储拼接后的URL键值对形式的字符串 char *query_list = malloc(size * 256); int len=0; for(int i=0; i<size; i++) { // 如果值为空或者空字符串则不拼接 if(strlen(array[i].value)==0){ continue; } char *key = array[i].key; char *value = array[i].value; // 如果值是字母或数字,则直接拼接 if(isalpha(value[0]) && isalnum(value[1]) && strcmp(value, "true")!=0 && strcmp(value, "false")!=0) { sprintf(&query_list[len], "%s=%s&", key, value); } else { // 否则需要将值加上双引号再拼接 sprintf(&query_list[len], "%s="%s"&", key, value); } len = strlen(query_list); } // 去掉最后一个&符号 if(len>0) { query_list[len-1] = 0; } return query_list; } void traverse(json_t *root, const char *prefix,int i,KeyValue *array) { if (json_is_object(root)) { const char *key; json_t *value; json_object_foreach(root, key, value) { char new_prefix[3000]; if (strlen(prefix) == 0) { sprintf(new_prefix, "%s", key); } else { if (json_is_array(value)) { sprintf(new_prefix, "%s[%d].%s", prefix, json_array_size(value) - 1, key); } else { sprintf(new_prefix, "%s.%s", prefix, key); } } traverse(value, new_prefix,i,array); } } else if (json_is_array(root)) { size_t i; json_t *value; json_array_foreach(root, i, value) { char new_prefix[3000]; sprintf(new_prefix, "%s[%d]", prefix, i); traverse(value, new_prefix,i,array); } } else { if (json_is_integer(root)) { int value = json_integer_value(root); char valuestr[20]; sprintf(valuestr, "%d", value); array[i].key=prefix;array[i].value=valuestr; i=i+1; printf("%s=%d\n", prefix, value); } else { const char *value = json_string_value(root); array[i].key=prefix;array[i].value=valuestr; i=i+1; printf("%s=%s\n", prefix, value); } } } int main() { char *json_str = "{"name":"John","age":30,"cars":[{"model":"X1","year":2020},{"model":"X3","year":2021}]}"; json_error_t error; json_t *root = json_loads(json_str, 0, &error); int len = strlen(json_str); KeyValue *array = malloc(len * sizeof(KeyValue)); int i=0; traverse(root, "",i,array); json_decref(root); return 0; }上面代码存在什么问题
这段代码存在几个问题:
1. `compare` 函数的参数类型应该是 `const void *` 而非 `const void`。
2. 在 `sort_dict` 函数中,如果 `value` 为空或空字符串,则不应该跳过,应该将其值设为 `null` 或 `""`。
3. 在 `sort_dict` 函数中,对于需要加上双引号的值,应该用反斜杠对字符串内的双引号进行转义,以免出现语法错误。
4. 在 `traverse` 函数中,对 `array` 数组赋值时,应该使用 `strcpy` 函数,而非直接将指针赋值给结构体成员变量。
5. 在 `traverse` 函数中,如果 `json_string_value` 返回的是 `NULL`,则无法将值存入结构体中,需要对这种情况进行特殊处理。