8.写一个 宏MIN,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
另外,当你写下面代码时会发生什么事? least = MIN(*p++,b);
宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B))对MIN(*p++, b)的作用结果是:((*p++) <= (b) ? (*p++) : (b)) 这个表达式会产生副作用,指针p会作两次++自增操作。
9.找出题中错误,并解释
void test1()
{
char string[10];
char* str1 = "0123456789"//错误处
strcpy(string, str1);
}//char *strl 定义了一个字符型指针变量,string[10]只存放10 个字符,字符串“0123456789”有11个字符,包括“\0”,数组下标越界。
10.找出题中错误,并解释
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
} //原来的函数只传递了p的内容而没有传递地址导致空间分配给p之后并未影响到str,str依旧没有空间可以用
//void GetMemory2(char **p) { *p=(char*)malloc(100); }
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf("%s", str);
}
11.输入一段字符串,无论是否有重复字母出现,都只打印出现过的小写字母,并按照小写字母顺序打印。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Sorted(char strl[],int len)
{
int i , j;
char c;
for (i = 0;i < len - 1; i++)
{
for (j = 0;j < len - i -1;j++)
{
if (strl[j] > strl[j+1])
{
c = strl[j];
strl[j] = strl[j+1];
strl[j+1] = c;
}
}
}
}
void List(char *str,int length)
{
char strl[100];
int i = 0,j = 0,k , l;
int len;
while ((str[i]!='\0')&&i < length)
{
strl[j] = '\0';
if (str[i] >= 'a' && str[i] <= 'z')
{
for(k = 0 ; k < j ; k++)
{
for (l = 0 ; l < j ; l++)
{
if(strl[k] == strl[l])
{
goto loop;
}
}
}
loop: strl[j] = str[i];
++i;
++j;
}
else
i++;
strl[j] = '\0';
}
len = strlen (strl);
Sorted(strl, len);
puts(strl);
}
int main(void)
{
char strl[100]={'\0'};
int len;
printf ("plz input sth:\n");
gets (strl);
len = strlen (strl);
List (strl,len);
return 0;
}