C语言 char** p 初始化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 char** p 初始化相关的知识,希望对你有一定的参考价值。

char** p 如何初始化?
void main()

char** p;
int i;
i=0;
while(scanf("%s",p[i])!=EOF)

i++;

Sort(p,6);//排序
Print(p,6);//输出


例如以上这段代码怎么改??

参考技术A 初始化可以用 char** p = NULL;
但是你这段代码要做什么?你这个二维指针都没有指向有效空间。追问

不对吧

追答

题目贴出来,看你的代码看不出你要干什么

追问

http://zhidao.baidu.com/question/464143941.html?quesup2
你看下这个

追答

看了你的目的,可以用楼上的,但是那个while循环很危险,会越界。程序很容易崩溃,加个跳出条件

追问

编译不对的
能帮忙改改吗

追答

编译应该不会有问题,注意查看标点符号是不是用英文格式写的,中文格式是不正确的。
运行崩溃的话

while(scanf("%s",p[i])!=EOF)

i++;


改成
for(i = 0; i< 10; i++)

scanf("%s",p[i]);

试试

参考技术B void main()

char p[10][100];
int i;
i=0;
while(scanf("%s",p[i])!=EOF)

i++;

Sort(p,6);//排序
Print(p,6);//输出
追问

不行
要用char** p
和Sort和Print的函数有关
void Print(char** p,int num)
void Sort(char** p,int num)

追答

你用我的方法可以的

追问

试过,编译不对

追答

额。报什么错误。

追问

1>d:\my documents\visual studio 2010\projects\1\1\2878字串排序.cpp(90): error C2664: “Sort”: 不能将参数 1 从“char [100][100]”转换为“char **”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>d:\my documents\visual studio 2010\projects\1\1\2878字串排序.cpp(91): error C2664: “Print”: 不能将参数 1 从“char [100][100]”转换为“char **”

追答

个人建议你的程序用string p[10]。这样更方便点。

参考技术C 呵呵,我做完字符串处理,你不会做输入处理了。下面是我做输入处理的方法。
#include<iostream.h>
#include<string.h>
bool GetDigit(const char*src,int &digit)//字符串中有数字串时,求出第一个连续的数字串,后面的忽略

while(*src)

if(*src>='0'&&*src<='9')//src指向首个数字


int sum=0;
while(*src>='0'&&*src<='9')//取所有的数字

sum=sum*10+(*src-'0');
src++;

digit=sum;//提取数字
return true;

src++;

return false;


int Compare(const char* p1,const char* p2)//p1>p2 return 1;p1==p2 return 0;p1<p2 return -1;

int digit1,digit2;
bool bflag1,bflag2;
bflag1=GetDigit(p1,digit1);
bflag2=GetDigit(p2,digit2);
if(bflag1&&bflag2) //两个字符串中都有数字

if(digit1>digit2) return 1;
else if(digit1==digit2) return 0;
else return -1;

if(!bflag1&&!bflag2)//两个字符串中都没有数字

return strcmp(p1,p2);

if(bflag1)//有一个字符串中有数字
return 1;
else
return -1;

void Sort(char**p,int num)//选择一种排序方法,此处各位可以改进

for(int i=0;i<num;i++)

for(int j=i+1;j<num;j++)

if(Compare(p[i],p[j])==1)

char* temp=p[i];
p[i]=p[j];
p[j]=temp;






void Print(char**p,int num)

for(int i=0;i<num;i++)
cout<<p[i]<<" ";
cout<<endl;

void Input(char**&p,int num)//注意此函数分配了堆内存,用完要做回收处理

if(num<=0) cout<<"exception,exit!"<<endl;
p=new char*[num];
for(int i=0;i<num;i++)
p[i]=new char[1024];
cout<<"请输入每个字符串后,按回车或按空格"<<endl;
for(i=0;i<num;i++)
cin>>p[i];

void main()

// char* p[]="abc#", "abc1","abc10","abcd","abc2","abc";//此处作了简化,直接定义了,没有做出输入处理,各位可以改进
char **p=NULL;
int num;
cout<<"请输入要处理的字符串数量:"<<endl;
cin>>num;

Input(p,num);
Sort(p,num);//排序
Print(p,num);//输出

//这里应该回收堆内存,防止内存泄露。
本回答被提问者采纳

C语言面试干货——char a[]=“从善若水“ 与 char *p=“从善若水“ 的区别

本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。

一、字符串数组的初始化

我们通常使用下面的code进行字符串数组的初始化:

const char arr[] = "Cong Shan Ruo Shui de Blog";
//或者
const char *pt = "Cong Shan Ruo Shui de Blog";

以上两个声明表明,pt与arr都是该字符串的地址。在这两种情况下,带双引号的字符串本身决定了预留给字符串的存储空间。尽管如此,这两种形式不完全相同


二、“const char arr[] = 字面量 ”与“const char *pt = 字面量 ”的区别

其实本质就是数组与指针的区别

2.1 对于“const char arr[] = 字面量

      以上面的声明为例子,数组形式(arr[])在计算机的内存中分配为一个内含27个元素的数组(加上吗,末尾的‘\\0’),每个元素被初始化为字符串字面量对应的字符。

      通常,字符串都作为可执行文件的一部分存储在数据段中。当程序载入内存的时候,也载入了程序中的字符串。字符串存储在静态存储区(static memory)中

      但是,程序在开始运行时才会为该数组分配内存。此时,才将字符串拷贝到数组中。注意,此时字符串有两个副本。一个是在静态内存中的字符串字面量,另一个是存储在arr数组中的字符串。

      arr是一个常量,不能使用自增访问,但是可以使用类似arr+1的操作


2.2 对于“const char *pt = 字面量

      指针形式(*pt)也使得编译器为字符串在静态存储区预留了27个元素的空间。另外,一旦开始执行程序,它会为指针变量pt留出一个存储位置,并把字符串的地址存储在指针变量中。该变量最初指向该字符串的首字符,但是它的值可以改变。

      指针pt是变量,所以可以使用递增运算符


大家看一个例子
#include<stdio.h>

#define MSG "Cong shan ruo shui"

int main()
{
	const char arr[] = MSG;
	const char *pt = MSG;
	
	printf("address of \\"Cong shan ruo shui\\":%p\\n","Cong shan ruo shui");
	printf("address of arr :%p\\n",arr);
	printf("address of pt :%p\\n",pt);
	printf("address of MSG :%p\\n",MSG);
	printf("address of \\"Cong shan ruo shui\\":%p\\n","Cong shan ruo shui");
	
	return 0;
} 

输出结果如下
在这里插入图片描述

  • 上面code的输出说明 pt和MSG的地址相同,而arr的地址不同,这与我们前面讨论的内容一致。
  • 虽然字符串字面量“Cong shan ruo shui”在程序的两个printf()函数中出现两次,但是编译器只使用了一个存储位置,而且与MSG的地址相同。编译器可以把多次使用的相同字面量存储在一处或多处。另一个编译器可能在不同位置存储3个“Cong shan ruo shui”
  • 静态数据使用的存储与arr使用的动态内存不同。不仅值不同,特定编译器甚至使用不同的位数表示两种内存。

在这里插入图片描述

以上是关于C语言 char** p 初始化的主要内容,如果未能解决你的问题,请参考以下文章

C语言面试干货——char a[]=“从善若水“ 与 char *p=“从善若水“ 的区别

C语言面试干货——char a[]=“从善若水“ 与 char *p=“从善若水“ 的区别

C连接字符串问题

C语言指针赋值?

C语言指针初学者 请帮我看看下面的提 为啥调用函数返回值是char型的 这样不就只能返回一个字符了吗

LeetCode:最长回文子串(C语言版)