高分求简单C语言问题
1) (10分)
int main()
{
return 0;
}
上面的返回值 "0 "有什么作用, 换成1 或者其他数字, 又什么什么差别与意义?
2) (5分) 如何用VS.NET2003编辑C程序。(具体步骤)
3) (5分) 在C语言中, if 语句与 switch 语句在效率上有差别吗, 谈论范围仅限效率.
4) (30分)(两程序,各15分)
以下两程序在TC可以正常运行, 在VC6.0环境下出现异常, 我认为应该属于同一问题, 如果是同一问题, 我仍然赠送30分.
file1.c
#include <stdio.h>
int main()
{
void copy_string(char from[], char to[]);
char *a = "I am a teacher. ";
char *b = "You are a student. ";
printf( "string a = %s\nstring b = %s\n ", a, b);
printf( "copy string a to string b: \n ");
//经过调试,问题出现在下面的函数调用, 可不知道为什么
copy_string(a, b);
printf( "string a = %s\nstring b = %s\n ", a, b);
return 0;
}
void copy_string(char from[], char to[])
{
int i = 0;
while (from[i] != '\0 ')
{
to[i] = from[i];
i++;
}
to[i] = '\0 ';
}
-------------------------------
file2.c
#include <stdio.h>
int main()
{
void copy_string(char *from, char *to);
char *a = "I am a teacher. ";
char *b = "You are a student. ";
printf( "string a = %s\nstring b = %s\n ", a, b);
printf( "copy string a to string b: \n ");
//经过调试,问题出现在下面的函数调用, 可不知道为什么
copy_string(a, b);
printf( "string a = %s\nstring b = %s\n ", a, b);
return 0;
}
void copy_string(char *from, char *to)
{
for (; *from != '\0 '; from++, to++)
{
*to = *from;
}
*to = '\0 ';
}
[解决办法]
1) (10分)
int main()
{
return 0;
}
上面的返回值 "0 "有什么作用, 换成1 或者其他数字, 又什么什么差别与意义?
返回0值是主程序向操作系统返回的值,表示程序正常结束,返回非0值表示有异常产生
[解决办法]
char *a = "I am a teacher. "; //其实a为常量指针了,所以调用 copy_string(a, b) 就有问题
char *b = "You are a student. ";
[解决办法]
2.VS2003写C程序,
新建VC++项目,选择Win32控制台,在弹出的属性页上选择空项目,
然后再加入(或新建).H,.C文件
[解决办法]
问题1:
有些记不太清了,好像在某本书上看到,main()函数的返回值可以告诉操作系统这个程序的调用是否成功,一般情况下成功返回0,如果有错误发生则返回相应的错误代码,不过一般用得不多,返回0是最常见的。
问题2:
VS.Net2003中不能对直接打开的C文件进行编译
如果是控制台项目,步骤如下:
新建--> 项目--> Visual C++项目--> Win32-> Win32控制台项目,输入项目名,点完成即可。
“解决方案资源管理器”里有一个以项目名命名的.cpp文件,这个是主文件,stdafx.cpp一般不用作修改,如个多个文件同时使用相同的include,可以打在stdafx.h文件中。
在这里自动生成的主函数是_tmain(),其实和main()是一样的。
问题3:
个人认为如果需要判断的情况很多时,用switch明显比if结构要快很多。
问题4:
两个程序中的子函数copy_string()写的都是正确的,但是在main()函数是从字符串a、b的定义来看,所作的操作是在程序中定义两个字符串常量,然后将这两个字符串常量的地址传给a和b,在程序中,常量和变量在内存中的存储位置是不同的,决定了变量可以被修改,而常量不可以,程序的改正方法很简单:
方法1:
将
char *a = "I am a teacher. ";
char *b = "You are a student. ";
改为
char a[] = "I am a teacher. ";
char b[] = "You are a student. ";
方法2:
将
char *a = "I am a teacher. ";
char *b = "You are a student. ";
改为
char a[100] = "I am a teacher. ";
char b[100] = "You are a student. ";
(注:100是字符串最大长度,也可改成其它的值)
两种方法都可以通过,但是方法2与更安全,因为使用方法1有一个限制,由于方法1的定义方法中定义的字符数据的长度是字符串长度加1,空间相对而言是有限的,使用方法1时如果a的长度比b大,那么程序还是会报错。
如果使用方法2,那么设定一个最大长度,相对于方法1会安全许多。
[解决办法]
(1)返回值 "0 "表示程序在这个地方结束了,个人认为返回其他值也行.
(4)你这两个属于同一个问题:char *b = "You are a student. "; "You are a student. "这是字符串常量存在常量区,不可修改!!b是指向这个常量区的指针.
你现在想把字符串a里的copy到b里,这样就修改了b指向的内容,当然是非法的!
在上面两个程序中把char *b = "You are a student. ";
改成 char b[] = "You are a student. ";
应该就没问题了..
[解决办法]
解决的方法
修改工程配置
改成Release工程可以通过
因为Debug工程会对指针进行检查
原因是你的指针
char *a = "I am a teacher. "; char *b = "You are a student. ";
是常量指针
改成字符数组
就可以了