C语言,关于字符串指针作参数方面的问题。

#include <stdio.h>

void main(){
char swap(char *a,char *b);
char str[3][20];
int i;
char (*p)[20];
printf("输入三个字符串 \n");
for(i=0;i<3;i++){
gets(str[i]);
}
p = str;
if(strcmp(str[0],str[1])) swap(p,p+1);
if(strcmp(str[0],str[2])) swap(p,p+2);
if(strcmp(str[1],str[2])) swap(p+1,p+2);
for(i=0;i<3;i++){
printf("%s\n",str[i]);
}
}

char swap(char *a,char *b){
char *temp;
temp = *a;
*a = *b;
*b = temp;
}

我想把p作参数传进swap函数里,我知道要改变指针的值才可以。
但是我这里应该怎么弄,我在函数外部调试的时候,*p就刚好是字符串的起始地址,但是我把p传进函数,*a就变成了字符串第一个字母。
该怎么弄才能达到我想要的效果?
我如果把函数写成

char swap(char (*a)[20],char (*b)[20]){
char *temp;
temp = *a;
*a = *b;
*b = temp;
}

就不能通过编译了
提示说
error C2106: '=' : left operand must be l-value;

如果不加*a的话,能通过编译,但是又不是值修改,达不到效果,该怎么办?

你要实现这种效果的话,建议你使用**a和**b作参数(形参)
即void swap(char **a,char **b)
因为char*是字符数组,后面跟的相当于字符数组名,
而指向字符数组(字符串)的指针,那就再加一星号,char**就是指向字符数组的指针了(当然它也可以表示字符串数组)

函数定义时使用char **a和char **b作参数,函数内容不需要变。
使用这两个形参后,在函数体中,*a表示指针a指向的字符数组(字符串),*b表示指针b指向的字符数组(字符串),因此,函数体不需要做改变,像原来那样写就行
温馨提示:内容为网友见解,仅供参考
第1个回答  2021-04-15

C语言字符串的学习,输入指定字符串,并且计算字符串的位数

C语言,字符串指针作实参传值的问题。
使用strcpy呗,反正你用gets读入的,最后都会有'\\0'吧。void swap(char *a,char *b){ char temp[20]; strcpy(temp, a); strcpy(a, b); strcpy(b, temp);}这样试试。

关于c语言中指针操作字符串和指针取值的问题
应该写为printf("%s\\n",(buf+1)); 或者 printf("%c\\n",*(buf+1)); (输出是e)问题二和一应该是同样的错误 printf("%s\\n",p);是打印整个字符串'test'如果你只打印一个字符,比如s printf("%c\\n",*(p+2));

C语言字符指针问题
printf("%c", *p); \/\/ 结果是hprintf("%c" , *(p+1)) \/\/ 结果是e最后是函数引用问题。这里是否能引用p,是需要看你的函数是怎么写的。比如说你说strcmp。他的原型为 extern int strcmp(const char *s1,const char *s2);他两个参数均为指针,当然可以直接使用p这个指针作为参数 ...

C语言里为什么字符指针变量指向的字符串常量中的内容是不可取代的?
指向字符串常量的话,这段常量字符串是存储在静态存储区的,内容不能修改。当然你可以让指针指到别的地方

★C语言 关于字符型指针的赋值问题
B的意思是将字符串首地址赋给数组,不正确。C的意思是将含有一个字符串指针的结构体或者含有一个字符串指针的数组赋值给字符串指针,不正确。D的意思是将含有一个字符串指针的结构体或者含有一个字符串指针的数组赋值给字符串数组,不正确。如果改为char*s[7]={"Olympic"}; 则是正确的。

关于C语言的字符串指针的问题?
指针是常量——这个指针只能指向申明时指向的目标,不能指向别处。指向的内容是常量——不能通过这个指针改变指向的内容,但指针可以指向别处,也可以通过其他方法改变该指针指向的内容。指针和指向的内容都是常量——这时指针不能再指向别处,它指向的内容也不可通过这个指针修改(用其他方法修改内容仍然是...

关于C语言指针的问题
(5)int *(*ptr)[4]; \/\/指针所指向的的类型是 int *()[4] 在指针的算术运算中,指针所指向的类型有很大的作用。 指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越 来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的 类型"和"指针所指向的类型"两个概念,是...

C语言指针问题
一、如有定义char y[4]= "321"则表达式 *y+2的值是'5' 。分析:y是字符串数组首元素'3'的地址,*y的值就是字符'3',再加上2,就是字符'5'(也可以说是字符'5'的ASC码值)。二、 如有定义char z[2][4]={"MAT", "LAB"};,则表达式*(*z+2)的值是 'T'。分析:z是二维字符...

关于字符串和指针的问题
D。C语言不支持在声明多个变量的同时,在一个句子中连续用=来初始化的这种形式。24。B A错。“ABCDE”加上隐藏的结束符,需要char s[6]才能放得下 C错。s指向的是常量字符串,不能赋值 D错。s未初始化,指向的是未知空间 27。C A错。s是数组,p是指针,虽然在使用上没差别,但毕竟是两个...

C语言 指针进阶问题;
你的程序里有几个问题:1.编程思路和要求的偏差,要求里说明限制字符串的数量不超过10,但对字符串的长度没有限定,在你的程序里通过长度限定为10的text变量来接收输入的字符串,实际上已经把输入字符串的长度限定在了10的范围内;2.冗余的变量,在主函数里变量a可能原意是保存n的值(n的值在循环里...

相似回答