c语言编程题库100题,关于字符串

C语言编程题在屏幕上输入一个字符串和一个要插入的字符_百度知道问卷正在加载中,请稍候...
如果由于网络原因导致此框一直不消失,请重新刷新页面!
1.下面有关字符数组的描述中错误的是________。&*A. 字符数组可以存放字符串B. 字符串可以整体输入、输出C. 可以在赋值语句中通过赋值运算对字符数组整体赋值D. 不可以用关系运算符对字符数组中的字符串进行比较2.下面程序的运行结果是______。
#include &stdio.h&
#include &string.h&
int main( )
& & char a[10]="abcd";
& & printf("%d,%d\n",strlen(a),sizeof(a));
& & return 0;
}&*A. 7,4B. 4,10C. 8,8D. 10,103.下面程序段的输出结果是______。char a[7]="abcdef";char b[4]="ABC";strcpy(a,b);printf("%c",a[5]);&*A. (空格)B. \0C. eD. f4.下面程序段的输出结果是______。char c[ ]="\t\v\\\0will\n";printf("%d",strlen(c));&*A. 14B. 3C. 9D. 65.判断字符串a是否大于b,应当使用______。&*A. if (a>b)B. if (strcmp(a,b))C. if (strcmp(b,a)>0)D. if (strcmp(a,b)>0)6.判断字符串a和b是否相等,应当使用______。&*A. if (a==b)B. if (a=b)C. if (strcpy(a,b))D. if (strcmp(a,b))7.下面叙述正确的是______。&*A. 两个字符串所包含的字符个数相同时,才能比较字符串B. 字符个数多的字符串比字符个数少的字符串大C. 字符串"STOP "与"STOP"相等D. 字符串"That"小于字符串"The"8.请读程序:
#include &stdio.h&
#include &string.h&
int main( )
& & char *s1="ABCDEF", *s2="aB";
& & printf("%d\n", strcmp(s1, s2));
& & return 0;
}上面程序的输出结果是______。&*A. 正数B. 负数C. 零D. 不确定的值9.设有两字符串"Good"、"Morning"分别存放在字符数组 str1[10]、str2[10]中,下面语句中能把"Morning"连接到"Good"之后的是______。&*A. strcpy(str1,str2);B. strcpy(str1, "Morning");C. strcat(str1, "Morning");D. strcat("Good" ,str2);10.下面程序的运行结果是______。
#include &stdio.h&
#include &string.h&
int main( )
& & char a[30];
& & strcpy(&a[0],"ch");
& & strcpy(&a[1],"def");
& & strcpy(&a[2],"abc");
& & printf("%s\n",a);
& & return 0;
}&*A.chdefabcB.cdaC.cdabcD.abcdef11.下面能正确进行字符串赋值操作的是________。&*A. char s[5]={"ABCDE"};B. char s[5]={'A','B','C','D','E'};C. char *s; s="ABCDE";D. char *s; scanf("%s",s);12.下列字符串赋值语句中,不能正确把字符串"Hello World"赋给数组的语句是______。&*A. char a1[]={'H','e ','l','l','o',' ','W','o','r','l','d','\0'};B. char a2[15]; strcpy(a2,"Hello World");C. char a3[15]; a3="Hello World";D. char a4[15]={ "Hello World"};(转)面试点:字符串strcpy函数(C语言面试题分析之二)
转自:http://blog.csdn.net/littletigerat/article/details/6439416
一.基本知识点
Strcpy(字符数组1,字符串2)
1.strcpy该函数是通过第二个参数的字符串的结束符来判断是否拷贝结束的;
2.strlen函数得到字符串的长度,是不包含字符串结束符的;
3.使用strcpy函数的时候,一定要注意第一个字符数组的大小至少不小于字符串的大小,否则便是访问越界;
4.字符串2后面的`\0`也一同被复制到字符数组1中;
二.程序错误分析
程序片段一:
            这里数组越界,因为字符的长度是,还有一个结束符。所以总共有个字符长度。而数组大小为,所以就越界了。  :使用函数的时候一定要注意前面目的数组的大小一定要大于后面字符串的大小,否则便是访问越界。
程序片段二:
            这里最大的问题还是没有结束符,因为的第二个参数应该是一个字符串常量。该函数就是通过判断第二个参数的结束符来判断是否拷贝结束的。所以在循环后面应加上  :字符数组和字符串的最明显的区别就是字符串会被默认的加上结束符。
程序片段三
                  这里的问题仍是越界问题。函数得到字符串的长度,是除结束符之外的。如果字符串的长度正好等于的话,就很明显越界了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。12个,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个!
1.gets()函数
问:请找出下面代码里的问题:
#include&stdio.h&
int main(void)
char buff[10];
memset(buff,0,sizeof(buff));
gets(buff);
printf("\n The buffer entered is [%s]\n",buff);
答:上面代码里的问题在于函数gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。这里推荐使用标准函数fgets()代替。
2.strcpy()函数
问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗?
#include&stdio.h&
int main(int argc, char *argv[])
int flag = 0;
char passwd[10];
memset(passwd,0,sizeof(passwd));
strcpy(passwd, argv[1]);
if(0 == strcmp("LinuxGeek", passwd))
printf("\n Password cracked \n");
printf("\n Incorrect passwd \n");
答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如:
$ ./psswd aaaaaaaaaaaaa
Password cracked
虽然上面的密码并不正确,但我们仍然可以通过缓存溢出绕开密码安全保护。
要避免这样的问题,建议使用 strncpy()函数。
作者注:最近的编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令‘-fno-stack-protector’来实现上述方案。
3.main()的返回类型
问:下面的代码能 编译通过吗?如果能,它有什么潜在的问题吗?
#include&stdio.h&
void main(void)
char *ptr = (char*)malloc(10);
if(NULL == ptr)
printf("\n Malloc failed \n");
// Do some processing
free(ptr);
答:因为main()方法的返回类型,这段代码的错误在大多数编译器里会被当作警告。main()的返回类型应该是“int”而不是“void”。因为“int”返回类型会让程序返回状态值。这点非常重要,特别当程序是作为依赖于程序成功运行的脚本的一部分运行时。
4.内存泄露
问:下面的代码会导致内存泄漏吗?
#include&stdio.h&
void main(void)
char *ptr = (char*)malloc(10);
if(NULL == ptr)
printf("\n Malloc failed \n");
// Do some processing
答:尽管上面的代码并没有释放分配给“ptr”的内存,但并不会在程序退出后导致内存泄漏。在程序结束后,所有这个程序分配的内存都会自动被处理掉。但如果上面的代码处于一个“while循环”中,那将会导致严重的内存泄漏问题!
提示:如果你想知道更多关于内存泄漏的知识和内存泄漏检测工具,可以来看看我们在Valgrind上的文章。
5.free()函数
问:下面的程序会在用户输入’freeze’的时候出问题,而’zebra’则不会,为什么?
#include&stdio.h&
int main(int argc, char *argv[])
char *ptr = (char*)malloc(10);
if(NULL == ptr)
printf("\n Malloc failed \n");
return -1;
else if(argc == 1)
printf("\n Usage
memset(ptr, 0, 10);
strncpy(ptr, argv[1], 9);
while(*ptr != 'z')
if(*ptr == '')
if(*ptr == 'z')
printf("\n String contains 'z'\n");
// Do some more processing
free(ptr);
答:这里的问题在于,代码会(通过增加“ptr”)修改while循环里“ptr”存储的地址。当输入“zebra”时,while循环会在执行前被终止,因此传给free()的变量就是传给malloc()的地址。但在“freeze”时,“ptr”存储的地址会在while循环里被修改,因此导致传给free()的地址出错,也就导致了seg-fault或者崩溃。
6.使用_exit退出
问:在下面的代码中,atexit()并没有被调用,为什么?
#include&stdio.h&
void func(void)
printf("\n Cleanup function called \n");
int main(void)
int i = 0;
atexit(func);
for(;i&0i++);
这是因为_exit()函数的使用,该函数并没有调用atexit()等函数清理。如果使用atexit()就应当使用exit()或者“return”与之相配合。
7.void*和C结构体
问:你能设计一个能接受任何类型的参数并返回interger(整数)结果的函数吗?
答:如下:
int func(void *ptr)
如果这个函数的参数超过一个,那么这个函数应该由一个结构体来调用,这个结构体可以由需要传递参数来填充。
8.*和++操作
问:下面的操作会输出什么?为什么?
#include&stdio.h&
int main(void)
char *ptr = "Linux";
printf("\n [%c] \n",*ptr++);
printf("\n [%c] \n",*ptr);
答:输出结果应该是这样:
因为“++”和“*”的优先权一样,所以“*ptr++”相当于“*(ptr++)”。即应该先执行ptr++,然后才是*ptr,所以操作结果是“L”。第二个结果是“i”。
9.问:修改代码片段(或者只读代码)
问:下面的代码段有错,你能指出来吗?
#include&stdio.h&
int main(void)
char *ptr = "Linux";
*ptr = 'T';
printf("\n [%s] \n", ptr);
答:这是因为,通过*ptr = ‘T’,会改变内存中代码段(只读代码)“Linux”的第一个字母。这个操作是无效的,因此会造成seg-fault或者崩溃。
10.会改变自己名字的进程
问:你能写出一个在运行时改变自己进程名的程序吗?
答:参见下面这段代码:
#include&stdio.h&
int main(int argc, char *argv[])
int i = 0;
char buff[100];
memset(buff,0,sizeof(buff));
strncpy(buff, argv[0], sizeof(buff));
memset(argv[0],0,strlen(buff));
strncpy(argv[0], "NewName", 7);
// Simulate a wait. Check the process
// name at this point.
for(;i&0i++);
11.返回本地变量的地址
问:下面代码有问题吗?如果有,该怎么修改?
#include&stdio.h&
int* inc(int val)
return &a;
int main(void)
int a = 10;
int *val = inc(a);
printf("\n Incremented value is equal to [%d] \n", *val);
答:尽管上面的程序有时候能够正常运行,但是在“inc()”中存在严重的漏洞。这个函数返回本地变量的地址。因为本地变量的生命周期就是“inc()”的生命周期,所以在inc结束后,使用本地变量会发生不好的结果。这可以通过将main()中变量“a”的地址来避免,这样以后还可以修改这个地址存储的值。
12.处理printf()的参数
问:下面代码会输出什么?
#include&stdio.h&
int main(void)
int a = 10, b = 20, c = 30;
printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2));
答:输出结果是:
110..40..60
这是因为C语言里函数的参数默认是从右往左处理的,输出时是从左往右。
在文章中找不到问题答案?您还可以
热门栏目订阅&&/&&&&/&&&&/&&
编写一个函数,把一个char组成的字符串循环右移n位。
编写一个函数,把一个char组成的字符串循环右移n位。例如,原来是&abcdefghi&,如果 n=2,移位后应该是&hiabcdefgh&。
函数原型如下:
//pStr是指向以'\0'结尾的字符串的指针
//steps是要求移动的n位
void LoopMove(char * pStr, int steps);
这个题目主要考查读者对标准库函数的熟练程度,在需要的时候,引用库函数可以很大程度上简化程序编写的工作量。
最频繁被使用的库函数包括strcpy()、memcpy()和memset()。
以下采用两种方法来解答。
方法一代码:
#include &stdio.h&
#include &string.h&
#define MAX_LEN 100
void LoopMove(char *pStr, int steps){
int n = strlen(pStr) -
char tmp[MAX_LEN];
memcpy(tmp, pStr+n, steps);
//拷贝字符串
memcpy(pStr+steps, pStr, n);
memcpy(pStr, tmp, steps);
//合并得到结果
int main(){
char str[] = &&;
LoopMove(str, 3);
printf(&%s\n&, str);
方法二代码:
#include &stdio.h&
#include &string.h&
#define MAX_LEN 100
void LoopMove(char *pStr, int steps){
int n = strlen(pStr) -
char tmp[MAX_LEN];
strcpy(tmp, pStr+n);
//拷贝字符串
strcpy(tmp+steps, pStr);
*(tmp + strlen(pStr)) = '\0';
strcpy(pStr, tmp);
//合并得到结果
int main(){
char str[] = &&;
LoopMove(str, 3);
printf(&%s\n&, str);
输出结果:

我要回帖

更多关于 c语言编程题目 的文章

 

随机推荐