1、下面程序的输出结果为多少?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void Func( char str_arg[ 100 ]) { printf( "%d\n" , sizeof(str_arg)); } int main( void ) { char str[] = "Hello" ; printf( "%d\n" , sizeof(str)); printf( "%d\n" , strlen(str)); char *p = str; printf( "%d\n" , sizeof(p)); Func(str); } |
sizeof和strlen()都可以用来统计字符串所占用的大小,二者的区别为:
- sizeof是运算符,而strlen是函数;
- strlen必须以char *作为参数,且必须以'\0'结尾;而sizeof()可以用于其他类型;
- strlen统计字符串中字符的长度,不包括结尾的'\0';
- 数组做sizeof的参数不退化,而传递给strlen就变为指针
sizeof(str):占用的字节为5 + 1 = 6,其中1为末尾的'\0';
strlen(str):5
sizeof(p):计算的是指针的长度,32位机器上为4B
Func(str):传递的是指针,大小为4
2、
下面程序的输出结果为多少?
1
2
3
4
5
6
7
8
9
10
11
12
|
void Func( char str_arg[2]) { int m = sizeof (str_arg); //指针的大小为4 int n = strlen (str_arg); //对数组求长度,str_arg 后面的那个2没有任何意义,数组已经退化为指针了 printf ( "%d\n" ,m); printf ( "%d\n" ,n); } int main( void ) { char str[]= "Hello" ; Func(str); } |
答:4 5
3、给定一个字符串,求出其最长的重复子串。
答:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using
namespace
std;
//给定一个字符串,求出其最长的重复子串
//方法一
string lsubstr_1(
const
string & str)
{
vector<string> vs;
for
(
int
i = 0; i < str.size(); i++)
vs.push_back(str.substr(i));
sort(vs.begin(), vs.end());
int
max = 0;
int
flag = 0;
for
(
int
i = 0; i <( vs.size()-1); i++)
{
int
j = 0;
while
(vs[i][j] == vs[i + 1][j] && j<vs[i].size() && j<vs[i+1].size())
j++;
if
(j>max)
{
max = j;
flag = i;
}
}
return
vs[flag].substr(0, max);
}
//方法二
string lsubstr_2(
const
string & str)
{
string maxstr;
for
(
int
i = 0; i < str.size();i++)
for
(
int
j = (str.size() - i); j >=1 ; j--)
{
string subs = str.substr(i, j);
int
front = str.find(subs);
int
back = str.rfind(subs);
if
(front != back && subs.size() > maxstr.size())
maxstr = subs;
}
return
maxstr;
}
//方法三
string lsubstr_3(
const
string & str)
{
string maxstr;
for
(
int
i = 0; i < str.size(); i++)
for
(
int
j = 0; j < i; j++)
{
string temp;
int
k = j;
int
m = i;
while
(str[m] == str[k] && i<str.size() && k<str.size())
{
m++; k++;
}
temp = str.substr(j, k - j);
if
(temp.size()>maxstr.size())
maxstr = temp;
}
return
maxstr;
}
void
main(
void
)
{
string test;
//cin >> test;
getline(cin, test);
cout << lsubstr_1(test) << endl;
cout << lsubstr_2(test) << endl;
cout << lsubstr_3(test) << endl;
}
4、
1
2
3
4
5
6
7
8
9
10
|
char *getmemory( void ) { char p[]=”hello world”; return p; } void test( void ) { char *str=NULL; str=getmemory(); printf (str); } |
请问运行Test 函数会有什么样的结果?答:乱码
如果要输出”hello world”,则需修改为
char
*p=”hello world”;
return
p;
5、
1
2
3
4
5
6
7
8
9
10
11
12
|
#include<stdio.h> int main() { unsigned char i=7; int j=0; for (;i>0;i-=3) { ++j; } printf ( "%d\n" ,j); return 0; } |
请问该程序的输出是多少?173