- 论坛徽章:
- 0
|
把程序再改进一下:- /* 运行结果依赖平台和该平台编译器设置的程序
- OS/400: CRTPGM的ACTGRP: *CALLER和*NEW时多次CALL 本程序的结果不同。
- Windows: 修改字符串常量将报错退出(0xC0000005: Access Violation)
- Linux: 修改字符串常量将coredump
- */
- #include <stdio.h>
- #include <string.h>
- int func3(char *p1, char *p2, char *fmt)
- {
- printf("@func3(), fmt addr:%p\n", fmt);
- printf("@func3(), p1=%s, p2=%s, fmt=%s\n", p1, p2, fmt);
- return 0;
- }
- int func2(char *p1, char *fmt)
- {
- printf("@func2(), fmt addr:%p\n", fmt);
- printf("@func2(), p1=%s, fmt=%s\n", p1, fmt);
- if(strcmp(fmt, "06") == 0)
- {
- strcpy(fmt, "01");
- printf("@func2(), fmt: 06->01\n");
- }
- else
- {
- printf("@func2(), fmt: %s->06\n", fmt);
- strcpy(fmt, "06");
- }
- return 0;
- }
- int func1(char *s1)
- {
- func2(s1, "06"); /* 这里的"06"和下一行的"06"是否会优化成指向同一个地址? */
- func3(s1, "1313", "06");
- return 0;
- }
- void *upperAstr(void *str)
- /*
- ASCII字符串中的小写字母变大写
- */
- {
- int i, n;
- char *p = (char *)str;
- n = strlen(p);
- for(i = 0; i < n; i++)
- {
- if(p[i] >= 0x61 && p[i] <= 0x7A) /* 'a'-'z' */
- p[i] -= 0x20;
- if(p[i] == 0x00) break;
- }
- return str;
- }
- void *upperStr(void *str)
- /*
- 当前环境(ASCII or EBCDIC) 字符串中的小写字母变大写
- */
- {
- int i, j, n;
- char *p = (char *)str;
- char *u = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- char *l = "abcdefghijklmnopqrstuvwxyz";
- n = strlen(p);
- for(i = 0; i < n; i++)
- {
- for(j = 0; j < strlen(l); j++)
- {
- if(p[i] == l[j])
- {
- p[i] = u[j];
- break;
- }
- }
- if(p[i] == 0x00) break;
- }
- return str;
- }
- #define HELLO " Hello World! "
- main(int argc, char **argv)
- {
- unsigned char *s1 = HELLO;
- char *s2 = HELLO;
- printf("----------Begin run <%s>\n", argv[0]);
- printf("s1=<%s>\n", s1);
- printf("s2=<%s>\n", s2);
- printf("s1 addr=%p\n", s1);
- printf("s2 addr=%p\n", s2);
- upperStr(s1);
- printf("----s1变大写之后:\n");
- printf("s1=<%s>\n", s1);
- printf("s2=<%s>\n", s2);
- printf("s1 addr=%p\n", s1);
- printf("s2 addr=%p\n", s2);
- func1("111");
- func1("222222");
- func1("333");
- #ifdef __OS400__
- printf("按'执行'键退出本程序.\n");
- getchar(); /* 以免CALL本程序后“一闪而过”看不清前面printf的结果 */
- #endif
- }
复制代码 如果本程序拿来做面试题,考的有这几点:
1、字符串常量是否允许修改与平台有关
2、重复的字符串常量的优化问题
3、OS/400平台的ACTGRP概念和影响 |
|