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);
}
答:6 5 4 4
 
sizeof和strlen()都可以用来统计字符串所占用的大小,二者的区别为:
  1. sizeof是运算符,而strlen是函数;
  2. strlen必须以char *作为参数,且必须以'\0'结尾;而sizeof()可以用于其他类型;
  3. strlen统计字符串中字符的长度,不包括结尾的'\0';
  4. 数组做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
posted on 2017-03-07 13:05  serser  阅读(352)  评论(0编辑  收藏  举报