为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
学习任务

工地少年与砖('◡') 的学生作业:

因为gets存在问题, 所以通过scanf也写了一份. gets版本在后面 但是scanf输入控制台的输入, 以空格作为分隔符, 所以这里统计的隔空个数是我们在output_array格式化后的字符串中的空格个数 #include void design_array(char **arr, int *arr_len) { static char a[100] = {0}; *arr = a; *arr_len = sizeof(a) / sizeof(a[0]); } void input_array(char *arr) { printf("请输入内容: \n"); scanf("%s", arr); } void output_array(char *arr, char **format_arr) { int i = 0; int new_arr_index = 0; // 注意要使用static 否则函数执行完毕, 栈上数据清空 static char new_arr[200] = {0}; while (arr[i] != '\0') { printf("%c ", arr[i]); // 赋值当前字符 new_arr[new_arr_index++] = arr[i]; // 赋值空格 new_arr[new_arr_index++] = ' '; i++; } *format_arr = new_arr; printf("\nnew_arr: %s\n", new_arr); } void cout_space(char *arr, int *space_amount) { int i = 0; *space_amount = 0; while (arr[i] != '\0') { if (arr[i] == ' ') { (*space_amount)++; } i++; } } int main(int argc, char const *argv[]) { /* (1)要求大家是设计一个design_arary()函数,自己定义返回值和参数。 要求design_array()函数中定义一个,static char a[100] = {0};,然后 把数组首地址和长度返回。 (2)设计一个input_array()函数,自定义返回和参数,要求用户从键盘 输入任意的字符串,存放到a数组中 (3)设计一个output_array()函数,要求输出a数组中的每个一字符, 以空格作为区分. w u h a n s h a n g h a i (4)设计一个cout_space()函数,自定义返回和参数,要求用户统计数组a中用户 输入的空格个数,并返回值给main函数。 (5)main()函数调用以上函数,并输出空格个数。 */ char *arr = NULL; char *format_arr = NULL; int arr_lens = 0; int space_amount = 0; design_array(&arr, &arr_lens); input_array(arr); printf("main func arr: %s \n", arr); output_array(arr, &format_arr); printf("main func format_arr: %s\n", format_arr); cout_space(format_arr, &space_amount); printf("输入的空格个数: %d\n", space_amount); return 0; } - 基于 gets 实现一个获取控制台输入空格的程序 ```c #include void design_array(char **arr, int *arr_len) { static char a[100] = {0}; *arr = a; *arr_len = sizeof(a) / sizeof(a[0]); } void input_array(char *arr) { printf("请输入内容: \n"); gets(arr); // warning: the `gets' function is dangerous and should not be used } void output_array(char *arr) { int i = 0; while (arr[i] != '\0') { if (arr[i] == ' ' || arr[i] == '\n') { i++; continue; } printf("%c ", arr[i]); i++; } printf("\n"); } void cout_space(char *arr, int *space_amount) { int i = 0; *space_amount = 0; while (arr[i] != '\0') { if (arr[i] == ' ') { (*space_amount)++; } i++; } } int main(int argc, char const *argv[]) { char *arr = NULL; int arr_lens = 0; int space_amount = 0; design_array(&arr, &arr_lens); input_array(arr); printf("main func arr: %s \n", arr); output_array(arr); cout_space(arr, &space_amount); printf("输入的空格个数: %d\n", space_amount); return 0; }

得分 100
学习任务

沫颖 的学生作业:

未加锁 /** * 1-2 线程互斥锁-课后任务 示例 创建两个线程,分别对全局变量进行 +1 操作,分别对比使用互斥锁和没有使用互斥锁 */ #include #include #include #include // 静态全局变量 static int global = 0; // 子线程执行函数 void *pthread_work(void *arg) { // 循环次数 int loops = *(int *)arg; // 中间变量 int tmp; for (int i = 0; i < loops; i++) { tmp = global; tmp++; global = tmp; } pthread_exit(NULL); } int main(int argc, char *args[]) { int err; int loops = 0; // 线程数 pthread_t tid[2] = {0}; // 终端参数 if (2 != argc) { fprintf(stderr, "please input %s argument:loops\n", args[0]); exit(EXIT_FAILURE); } // 类型转换 loops = atoi(args[1]); // 创建线程 for (int i = 0; i < 2; i++) { err = pthread_create(&tid[i], NULL, pthread_work, (void *)&loops); if (0 != err) { fprintf(stderr, "[ERROR] pthread_create():\n"); exit(EXIT_FAILURE); } } // 等待子线程退出 for (int i = 0; i < 2; i++) { pthread_join(tid[i], NULL); } printf("global is %d\n", global); return 0; } 执行结果 【图片】 加锁-静态初始化 /** * 1-2 线程互斥锁-课后任务 示例 创建两个线程,分别对全局变量进行 +1 操作,分别对比使用互斥锁和没有使用互斥锁 */ #include #include #include #include // 静态全局变量 static int global = 0; // 线程互斥锁 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 子线程执行函数 void *pthread_work(void *arg) { // 循环次数 int loops = *(int *)arg; // 中间变量 int tmp; for (int i = 0; i < loops; i++) { // 加锁 pthread_mutex_lock(&mutex); tmp = global; tmp++; global = tmp; // 释放锁 pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main(int argc, char *args[]) { int err; int loops = 0; // 线程数 pthread_t tid[2] = {0}; // 终端参数 if (2 != argc) { fprintf(stderr, "please input %s argument:loops\n", args[0]); exit(EXIT_FAILURE); } // 类型转换 loops = atoi(args[1]); // 创建线程 for (int i = 0; i < 2; i++) { err = pthread_create(&tid[i], NULL, pthread_work, (void *)&loops); if (0 != err) { fprintf(stderr, "[ERROR] pthread_create():\n"); exit(EXIT_FAILURE); } } // 等待子线程退出 for (int i = 0; i < 2; i++) { pthread_join(tid[i], NULL); } printf("global is %d\n", global); return 0; } 执行效果【图片】 加锁-动态初始化 /** * 1-2 线程互斥锁-课后任务 示例 创建两个线程,分别对全局变量进行 +1 操作,分别对比使用互斥锁和没有使用互斥锁 */ #include #include #include #include // 静态全局变量 static int global = 0; // 线程互斥锁 static pthread_mutex_t mutex; // 子线程执行函数 void *pthread_work(void *arg) { // 循环次数 int loops = *(int *)arg; // 中间变量 int tmp; for (int i = 0; i < loops; i++) { // 加锁 pthread_mutex_lock(&mutex); tmp = global; tmp++; global = tmp; // 释放锁 pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main(int argc, char *args[]) { int err; int loops = 0; // 线程数 pthread_t tid[2] = {0}; // 终端参数 if (2 != argc) { fprintf(stderr, "please input %s argument:loops\n", args[0]); exit(EXIT_FAILURE); } // 类型转换 loops = atoi(args[1]); // 创建线程 for (int i = 0; i < 2; i++) { err = pthread_create(&tid[i], NULL, pthread_work, (void *)&loops); if (0 != err) { fprintf(stderr, "[ERROR] pthread_create():\n"); exit(EXIT_FAILURE); } } // 动态初始化 pthread_mutex_init(&mutex, NULL); // 等待子线程退出 for (int i = 0; i < 2; i++) { pthread_join(tid[i], NULL); } printf("global is %d\n", global); // 销毁锁 pthread_mutex_destroy(&mutex); return 0; } 执行效果【图片】

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号