C语言字符串二维数组char q[][10]="aaa","bbb","ccc"

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言字符串二维数组char q[][10]="aaa","bbb","ccc"相关的知识,希望对你有一定的参考价值。

q[][10]="aaa","bbb","ccc" 他们是怎么表示。 q[0][1]代表的是a还是aaa? 每行每列对应分别代表哪个。q[0][1]代表的是a还是aaa? q[0][10]呢 ,求大神画出来看看。。。新手小白真不懂

char q[][10]= "aaa","bbb","ccc"; 要有花括号。
char q[][10] 声明 q 是2维字符数组,第一维大小待定,第二维大小是10。
也可以理解 q 是 字符数串 数组,每个字符串长度不超过10,数组大小待定
花括号 "aaa","bbb","ccc" 这段东西表示初始化q数组。 它决定了 第一维大小 是 3。
等于 声明了 char q[3][10]= "aaa","bbb","ccc"; 有3个字符串,分别是"aaa","bbb","ccc".
语句中 q[0][1] 代表了数组的一个元素, 第0行第1个,现在存放的是一个字符 'a'.
语句中 q[行号][列号], q[0][0],第0行第0个元素 'a',q[1][0],第1行第0个元素 'b',
q[2][0],第2行第0个元素 'c'.
语句中 下标从0起算,所以最大下标是 q[2][9]. 这个元素初始化时未给具体字符,所以清空了。
printf("%s ", q[0] ); 打印第0行字符串,输出 aaa. (格式是 %s)
printf("%s ", q[1] ); 打印第1行字符串,输出 bbb.
printf("%s ", q[2] ); 打印第2行字符串,输出 bbb.
printf("%c ", q[i][j] ); 打印第 i 行 第 j 列 的 一个字符。 (格式是 %c)
参考技术A 首先纠正一下,文中所给的叫字符串数组,不是字符串二维数组,因为c语言中没有字符串变量,所以用字符变量表示一串字符,这就是字符串,而很多字符串组成的数组就叫字符串数组,例如q[3][10]表示有3个字符串,每个字符串最多可占用10个字节,也就是行标为个数,列标为最大字节数,而q[0][1]表示第0个字符串的第1个字符,这个和二维整型数组一样,文中q[0][1]='a',为了容易记住,口诀如下,记住列表示字符串最大长度,简记列车长 参考技术B 你的C/C++数组概念要好好加强一下。char q[][10]="aaa","bbb","ccc"——这是错误的,编译都过不了,应该是char q[][10]="aaa","bbb","ccc";。q[0][1]是一个字符元素,怎么可能是aaa?肯定只能是a(就是aaa中的第二个a);这个数组每行只有10个字符,最大下标是9,哪儿会有q[0][10]? 参考技术C

q[0][1]代表的是第二个a。

q[0][10]是没有的,越界了。

追问

想问下,为什么q[0][10]没有呀? 他不是可以看成‘\0’吗

面试总结—— 字符串

收集一些关于字符串的面试笔试题。

1. 逆序字符串

思路:原地逆序,将字符串两边的字符逐个交换。例如,给定字符串“abcd”,逆序的过程分别是交换字符a和d,交换字符b和c。

实现1):通过指针

char *Reverse(char *s)
{
  char *p = s;
  char *q = s;
  while(*q) ++q;
  q--;
  while(q > p)
  {
     char t = *p;
        *p++ = *q;
        *q-- = t;   
  }
    return s;
}

实现2):递归法

char *Reverse(char *s,int left,int right)
{
    if(left >= right)
        return s;
    char t  = s[left];
    s[left] = s[right];
    s[right] = t;
    Reverse(s,left+1,right-1);
}

 

2. 找出字符串中第一次只出现一次的字符

思路:巧妙的利用STL中的map容器,代码很简单。

int FirstNotRepeatingChar(string str) {
    map<char,int> mp;
    for(int i=0; i<str.size();++i){
        mp[str[i]]++;
    }
    for(int i=0;i<str.size();++i){
        if(mp[str[i]]==1)
            return i;
    }
    return -1;
}

 

3. 字符串的排列

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

思路:递归法,通过交换遍历第k位可能的所有字符。

void PermutationHelp(vector<string> &ans, int k, string str) //遍历第k位的所有可能
{
    if(k == str.size() - 1)
        ans.push_back(str);
    unordered_set<char> us;  //记录出现过的字符
    sort(str.begin() + k, str.end());  //保证按字典序输出
    for(int i = k; i < str.size(); i++)
    {
        if(us.find(str[i]) == us.end()) //只和没交换过的换
        {  
            us.insert(str[i]);
            swap(str[i], str[k]);
            PermutationHelp(ans, k + 1, str);
            swap(str[i], str[k]);  //复位
        }
    }
}
 
vector<string> Permutation(string str) {
    vector<string> ans;
    PermutationHelp(ans, 0, str);
    return ans;
}

 

4. 字符串转换为数字,《primer 5th》p328中提供封装的函数。

C语言实现:

int Mystoi(char *str){
    if(str==NULL)
    {
        printf("Invalid Input");
        return -1;
    }
    while(*str==  || *str==  ){
        str++;
    }
    int nSign = (*str==-) ? -1 1 ;
    if(*str==+ || *str==-)
    {
        *str++;
    }
    int res = 0;
    while(*str>=0 && *str <=9)
    {
        res = res*10 + (*str-0);
        *str++;
    }
    return res*nSign;
}

 

5. 数字转换为字符转

C语言实现:

char* Myitos(int num){
    static char str[1024];    //这里必须要static, 因为局部变量是要释放掉的 见见《Primer 5th》p185
    int sign = num, i=0, j=0;
    char temp[11];
    if(sign<0){
        num = -num;
    };
    do{
        temp[i] = num%10+0;
        num /= 10;
        i++;
    }while(num>0);
        //下面三行也可以不注释
    /*
    if(sign<0){
        temp[i++]=‘-‘;
    }*/
    temp[i]=;
    i--;
    while(i>=0){
        str[j]=temp[i];
        j++;
        i--;
    }
    str[j]=;
    return str;
}

int main(int argc, char const *argv[])
{
    printf("%s
",Myitos(-12345));   
    return 0;
}

输出 12345,若不注释,输出-12345

上面得两个函数如果使用c++11中的库函数,则非常简单,见《Primer 5th》p328 如下:

#include <iostream>
#include <string>
using namespace std;

int main(int argc, char const *argv[])
{
    string s = "12345";
    int i = 8888;

    cout << stoi(s) << endl;      // 12345
    cout << to_string(i) << endl; // 8888

    return 0;
}

 

以上是关于C语言字符串二维数组char q[][10]="aaa","bbb","ccc"的主要内容,如果未能解决你的问题,请参考以下文章

C语言三维数组问题

C语言-字符串相加考虑进位

C语言中 char num[15][2]是啥意思? 15 和2分别代表啥意思?

c语言去除字符串左边空格、TAB键、换行符

C语言,怎么利用一个循环遍历一个二维数组呀?急!!!

在C语言中能否直接给指针指向的数据赋值?为啥?