高手来帮我解决下 C语言的6个题 我就这些分了全给你

一共有5个题 马上面试了 想搞懂 很简单的
1. 下面的宏定义存在一些问题,请给出一个更好的实现
#define MIN(a,b) (a<b?a:b)
2. 请说明下列俩条语句的异同
char*p="hello world";
char str[]="hello world";
3. 在上题中
sizeof(p)=?
sizeof(str)=?
*str=?
str[0]=?
4.假设为WINDOWS下的32位C
struct foo {
char a;
int b;
short c;
};
char str[]="abcdefghijklmn";
struct foo *foo=(sturct foo*)str;
foo->b=?
5 根据下列代码,请实现链表反转函数
struct data {
int key;
struct data *next
};
struct data *head=NULL;
struct data* reverse(struct data *head){
}
6题 请用C语言实现strlen()函数,该函数的功能是计算一个字符串的长度.

先让我朋友答答 一会在说 占地方先。!
-----------------------------------------------------
俺朋友 太烂了 你在看吗 大胖 哈哈
----------------------------------------------------
解答如下:

既然是面试 那就给你尽量详细的说明吧

1.最保险的答案
#define MIN((a),(b)) (((a)<(b))?(a):(b))
2.
char *p = "hello world";
他是定义一个指针p,指针p指向的内存存储的是h,指针p指向的下一个地址存储的是e
依次类推,直到最后的d
所以你以%c的格式输出的时候只能看到h
并且p是可以再次用语句赋值的 并不是不可以的哦。
char str[] = "hello world";
他是定义一个字符数组,与其他定义不同的是他在数组的尾部自动加个\0 并且\0也属于数组里的
所以char str[] = "hello world";数组的长度应该是12 ,str[11]应该是"\0";
3.
sizeof(p) = 一般是 4; \\跟机器和编译环境有关系阿
因为p是指针 指针一般只占用4个字节
sizeof(str) = 12
因为str是数组 而数组的sizeof应该等于 sizeof(数组类型) * 数组长度 因为char类型占一个字节所以
sizeof(str) = 1*12 =12

你问的应该是*p 和 str[0]吧 ? 呵呵 不管了 反正 *p str[0] *str 都是h 原因在上面的分析中就能找到
还有一句话 数组名也是指针 只不过是不能移动的而已
4.
这题出得非常没有意思。我想应该跟运行以后内存里的数有关
5.
正好我手上还有以前给朋友作的 和这个类似 你参考吧
#include <stdio.h>
#include <malloc.h>
typedef struct ym
{
char Data;
struct ym * Next;
}Zhizhen;

Zhizhen * Jl();//建立链表
void Xs(Zhizhen * Hend);//显示链表
void Zh(Zhizhen ** pHend);//转换链表

void main()
{
Zhizhen * Hend = NULL;
Hend = Jl();
if (NULL == Hend)
{
printf("没有建立链表! 程序结束!\n");
return;
}
if (NULL == Hend->Next)
{
printf("只有一个元素 %c 不能称为链表 程序结束!\n",Hend->Data);
return;
}
printf("原链表如下:\n");
Xs(Hend);
Zh(&Hend);
printf("转换后链表如下:\n");
Xs(Hend);
}

Zhizhen * Jl()
{
Zhizhen * Hend = NULL;
Zhizhen * p = NULL;
Zhizhen * q = NULL;
char Cdata = 'a';
int Temp = 0;
Cdata = getchar();
if (Cdata == 10 && Temp == 0)
{
return NULL;
Temp++;
}
Hend = (Zhizhen *)malloc(sizeof(Zhizhen));
Hend->Data = Cdata;
Hend->Next = NULL;
q = Hend;
Cdata = getchar();
while(Cdata != 10)
{
p = (Zhizhen *)malloc(sizeof(Zhizhen));
p->Data = Cdata;
p->Next = NULL;
q->Next = p;
q = p;
Cdata = getchar();
}
return Hend;
}

void Xs(Zhizhen * Hend)
{
int Temp = 1;
while(Temp)
{
printf("%c",Hend->Data);
if(NULL == Hend->Next)
{
Temp = 0;
}
else
{
Hend = Hend->Next ;
printf(" -> ");
}
}
printf("\n");
}

void Zh(Zhizhen ** pHend)
{
Zhizhen *p = *pHend;
Zhizhen *r = NULL;
Zhizhen *q = NULL;
q = p->Next;
while(q != NULL)
{
r = q->Next;
q->Next = p;
p = q;
q = r;
}
(*pHend)->Next = NULL;
*pHend = p;
}

6.
给你提示 把字符串一个一个向后查(可以用指针 或者数组带下标)同时计数直到遇到'\0'或者10 为止
'\0'好理解 为什么还有10呢 呵呵 如果你多做程序就会发现如果串是用户输入的那么最后结尾 用'\0'
来判断会失效 因为 回车 换行其实是 2个东西哦 呵呵
如果你去应聘的话这个题你应该很容易就能做出来了 给你点提示就好了

我也快面试了 一起加油吧

祝你成功

百度 老岩 gabmyd@126.com
温馨提示:内容为网友见解,仅供参考
第1个回答  2006-11-10
如果你得不到满分,就是对方瞎了狗眼。

1.
#define MIN((a),(b)) ((a)<(b)?(a):(b))
2.
一是一个字符串指针,指向的静态的串,位于程序全局静态储存区域,不能改变串中内容,二是一个字符数组,数据位于栈中,可以改变内容。
3.
视环境而定,在16位机上是2,32位是4,64位是8
12
'h'
'h'
4.
0x62636465
5.
struct data* reverse(struct data *head)
{
struct data* tempNext = NULL;
struct data* current = head;
if (head == NULL) return NULL;
while (current->next != NULL)
{
tempNext = current->next;
current->next->next = current;
current = tempNext;
}
head->next = NULL;
head = current;
return head;
}
6.
int strlen(char *str)
{
int i = 0;
if (str == NULL) return 0;
while (*str++ != '\0')++i;
return i;
}
}
第2个回答  2006-11-10
确实很难啊。术业有专攻啊。
int strlen(char* p)
{
int i = 1;
while (*(p + i) != '\0')
{
i++
}
return i;

}
第3个回答  2006-11-10
抱歉,我对此不是很清楚阿

C语言的几道考题,请各位高手帮忙,急!!!(追加50分)
} void main(){ int a,b,c;printf("请输入3个数;")scanf(“%d %d %d”,&a,&b,&c);s=stu(a,b,c);printf("%d",s);} 实在是懒的写了,都快1点了。困了。。。我给你写思路吧`我写清楚点~如果你有基础绝对可以自己写出来的。。。第七题 要求不是很明确 要不要判断输入的数字...

请高手帮我解决一下这道C语言题目,谢谢!
1、1234567 s1指针指向1,s2指针指向7 t=*s1++ s1指针指向2(t得到1的值 1)s1=*s2-- s2指针指向6(值发生改变1734567)s2=t; (值发生改变1734517)2、s1指针指向2,s2指针指向6 t=*s1++ s1指针指向3(t得到2的值 7)s1=*s2-- s2指针指向5(值发生改变1714517)s2=t; ...

谁能帮我解决下面的C语言问题啊,最好能说明解析过程。
解析:道理同第1题,执行switch(a),满足条件进入switch(b),接着满足条件执行case 0后语句,break跳出switch(b),由于跳出后没有语句break,因此接着执行switch(a)。记住一点:break语句只能跳出一个switch;3、至于这题,估计是你输错了,如果题目真这样,就是题目错了。编译都不可能通过,在...

计算机C语言编程问题 高手来 回答好了加分
p=a;那么*p = *a;而*a = a[0];也就是说*p = a[0];那行程序相当于:for(i=0 ; i<4 ; i++) a[i]=++a[0];\/\/你应该好好区分一下“*”在不同位置不同的含义、、、有三种含义;(1)变量的声明时,int a[5];int* p=a;\/\/p就相当于一个a指向的地址的别名。注意:是p...

C语言高手 请告诉我几道简单的题! 我想搞明白 谢谢
第一个题,t是一个数组,pt是一个指针数组,做完循环后,指针数组就指向了t这个数组了。即pt和t应该是一个内容,只不过t是const的。*(pt+1)就是t[1],*(*(pt+l)+2)就是t[1][2]了。第二个题,sum没有初始化,所以答案就选c了。记住一点哦,永远不要使用未初始化的变量!第三个题,...

C语言的题,高手快点来救救我,
incude<stdio.h> define N 5 void main() { int a[N]={ 8,6,5,4,1 },i,j,k;for ( i=0;i<N-1;i++ ) for ( j=i+1;j<N;j++ ) if ( a[i]>a[j] ) {k=a[i];a[i]=a[j];a[j]=k;} for ( i=0;i<N;i++ ) printf("%d ",a[i]); printf("\\n");...

请高手帮我解决一下这道C语言题目,谢谢!
a的地址传给n,while 把a的值变为 -1,因为while跳出循环的条件是0,而测试的是减一之前的a,所以a的值变为-1了,输出之前,a的值又被加为0,所以结果是 0

c语言几个小小的问题 高手帮个忙
1. C 逗号在这里不合法 2. 输出2,虽然x是浮点型,但是10和4都是整型,所以先按整型运算,再将结果转换为浮点型 3. (++x, y++)表示这是一个逗号表达式,逗号表达式取最后一个表达式的值,也就是y++的值,所以输出结果是3和3 4. printf("%8.4g\\n",b); 这句输出8756,%g表示按%e或者...

C语言编程基础题目,请帮我写写。
1、设6个int型变量,如n1,n2,n3,n4,n5,n6分别代表不同类型的字符个数,如n1为大写英文,n2为小写英文等等。2、用1 个循环,逐个判断字符的类型,是大写的给n1+1,小写的给n2+1,等一次类推。3、退出循环时就6个不同类型的个数都统计出来了。程序简单如下:include<stdio.h> include<string.h...

C语言高手帮忙做这三道题,要详解 谢谢拉!!
x"的值为0时。所以就是x==0.2、C 这题和上题一样,就是(m)表达式为真时,执行a++;为假时,执行a-。表达式m的真假与表达式m!=0一样,所以选C。3、C define是宏定义,这里的效果就是把s(m,n)替换成m\/n,所以s(4+2,2+1)进行替换后就成了4+2\/2+1=4+1+1=6。所以选C ...

相似回答