c语言指针数组问题,求高手解惑。。。。

编译错误如下:
error C2664: 'length' : cannot convert parameter 1 from 'char *[20]' to 'char *'
(个人解决不了,望高手伸手援助。)

#include<stdio.h>
int length(char *p);
void main(){
char *str[20];
int len;
printf("please input s string:\n");
scanf("%s",str);
len=length(str);
printf("串的长度:%d\n",len);
}
int length(char *p){
int k=0;
while(*p!='\0'){
k++;
p++;
}
return k;
}
写一个函数,求多个字符串长度,在main函数中输入字符串,并输出长度。

错误很明显啊,int length(char *p);需要一个char * 参数,你的str 却是char *[] ,是一个指针数组,明显类型不匹配
看你的程序,应该是想输入一个字符串并判断其长度吧
你把char *str[20]; 改成 char *str 试试追问

换了,编译运行通过,黑框里输入却得不出结果,程序里应该仍有错误。

追答

scanf("%s",str);改成scanf("%s",&str);试试
或者你把char *str[20]; 改成char str[20]; 也行

追问

仍是不行,错误仍指向这句:
len=length(str);
cannot convert parameter 1 from 'char *[20]' to 'char *'

追答

char *[20]改成char str[20],注意中间没有指针(*号)

追问

这个可以,不过这到题目要求用指针数组做,可不可以用指针数组解决呢?

追答

如果你使用char *str[20]的话,试试把len=length(str);改成len=length(str[0]);
PS:这个程序应该是要输入多个字符串并进行判断的吧?

追问

恩,可以编译运行,不过黑框还是得不出结果,究竟是什么问题所在呢,想的头都破了。

追答

是控制台没有显示数值,还是控制台自动关闭了?

追问

输入之后按回车就变成这样:

追答

void main(){
int i;
char *s;
char *str[20];
int len;
for(i=0;i<20;i++)
{

s = (char *)malloc(20);
printf("please input s string:\n");
scanf("%s",s);
str[i] = s;
len=length(str[i]);
printf("串的长度:%d\n",len);
}
}

追问

多谢多谢!!!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-24
#include <stdio.h>
#include <stdlib.h>

int length(char *p);
void main(){

// 每个元素都是char*, 你定义了20个这样的元素,它能指向20个字符串
// 但是你都没为这些串分配内存。
char *str[20];
int len;
printf("please input s string:\n");

// 这里要先分配内存
str[0] = (char*)malloc(128);

// 这里不要用str,用str[n]的形式。每个str[n]都是一个字符串
scanf("%s",str[0]);
len=length(str[0]);
printf("串的长度:%d\n",len);
free(str[0]);
}
int length(char *p){
int k=0;
while(*p!='\0'){
k++;
p++;
}
return k;
}追问

编译可行,就是不能实现多个字符串算长度。

追答

哎呀,可以!下面的就可以输入20 个字符串的!

#include
#include

int length(char *p);
void main(){

// 每个元素都是char*, 你定义了20个这样的元素,它能指向20个字符串
// 但是你都没为这些串分配内存。
char *str[20];
int len, i;

for (i = 0; i < 20; i++)
{
printf("please input s string:\n");

// 这里要先分配内存
str[i] = (char*)malloc(128);

// 这里不要用str,用str[n]的形式。每个str[n]都是一个字符串
scanf("%s",str[i]);
len=length(str[i]);
printf("串的长度:%d\n",len);
free(str[i]);
}
}
int length(char *p){
int k=0;
while(*p!='\0'){
k++;
p++;
}
return k;
}

第2个回答  2011-10-24
char *str[20]; //这个表示有20个元素,每个元素都是字符串指针。
//去除*号,改为:
char str[20]; //这个表示有20个元素,每个元素都是字符类型。在C中,str就是字符串。

若没有黑框出现,请按CTRL+F5来运行程序。追问

这样可以,不过能不能用指针数组来做啊?

追答

直接不可以,因为指针数组不能存放字符,或者字符串。间接就可以了,但只需要一个数组元素。下面是程序:
#include
int length(char *p);
void main(){
char s[20];
char *str[1]={s};
int len;
printf("please input s string:\n");
scanf("%s",s);
len=length(str[0]);
printf("串的长度:%d\n",len);
}
int length(char *p){
int k=0;
while(*p!='\0'){
k++;
p++;
}
return k;
}

第3个回答  2011-10-24
#include<stdio.h>
int length(char *p);
void main(){
char str[20]; /*这里修改成这样就可以了*/
int len;
printf("please input s string:\n");
scanf("%s",str);
len=length(str);
printf("串的长度:%d\n",len);
}
int length(char *p){
int k=0;
while(*p!='\0'){
k++;
p++;
}
return k;
}
其他地方不用改,已测试追问

但可不可以用指针数组解决问题呢?题目是这样要求的。

第4个回答  2011-10-24

#include<stdio.h>

int length(char *p);

void main() {

char str[20];

int len;

printf("please input s string:");

gets(str);

len = length(str);

printf("串的长度:%d\n",len);

}

int length(char *s){

int len = 0;

char *p = s;

while(*p++) len++;

return len;

}

追问

高手啊,这样可以,请问一下这个:while(*p++) len++;怎么运行。
还有,可不可以用指针数组做啊?

追答

while(*p++)等同于,如果*p为真(*p != '\0'),则执行p++;,否则,结束循环。
也许这样写,要容易理解:
while(*p != '\0') {
p++;
len++;
}
这里利用'\0'的ASCII值为0来结束循环,这是经验与巧合的结果,知道了,就没什么了。

追问

那为什么要用char *p = s;
直接用while(*s!='\0')不行吗?

追答

可以,但这个习惯不好,原因是调用函数(main)没有保存字符串s的首址,如果在被调函数(length)中改变了s的位置,调用函数就不能正确的使用s了,这是由于数组是按址传递的。

第5个回答  2011-10-24
clude<stdio.h>
int length(char *p);
void main(){
char str[20];
int len;
printf("please input s string:\n");
scanf("%s",str);
len=length(str);
printf("串的长度:%d\n",len);
}
int length(char *p){
int k=0;
while(*p!='\0'){
k++;
p++;
}
return k;
}
相似回答