/*为什么括号里面加个[]就是错的呢*/ 因为你在前面已经定义了str为一个字符型数组,数组也可以理解为指针,你那3个自定义函数的参数都是指针,所有参数就是str(代表数组的首地址),而你用str[]代表的是数组的某个元素,当然如果你前面没定义数组的话,直接定义函数,它的参数可以使数组,但是这时候该数组会弱化为指针,例如:插入字符 char* insert_char(str[],int n) n代表数组的长度。
scanf("%c",&c); 就是从输入缓冲区读取你要删除的字符
for(i=j=0;str[i]!='\0';i++) /*这个str[i]!='\0'是什么意思*/ 字符串都是以字符'\0'结束的,这个你看不到,可以理解为空格。 在这个循环里是一直往后读取知道字符串结束,也就是遇见'\0'.
str[j]='\0'; /*这个str[i]!='\0'是什么意思*/ 当读完字符串,你也就删除完了你想删除的 ,这个时候你要手动给字符串加个'\0'作为结束的标志。
最后输出的是整个数组。
至于你追问的问题,我想说,你输入的那个字符不一定在字符串里面有,所有就不一定会删除。如果你想知道他有没有的话 我觉得你可以再delete函数里最前面判断一下
bool check(char str[],char c)
{
for(int i = 0 ; str[i] != '\0'; i++)
{
if( str[i] == c)
return true;
}
return false;
}
当然完全没这个必要,做这个循环浪费资源,我只是想告诉你这么一个知道哈
我也新手。
/*偶是菜鸟,换笔记本了,没装gcc,只帮你回答下问题吧*/
#include
int main()
{
extern void enter_string(char str[]);
extern void delete_string(char str[],char ch);
extern void printf_string(char str[]);
char c,str[80];
enter_string(str); /*为什么括号里面加个[]就是错的呢* //*这里调用了enter_string函数,按后面的函数声明,传给该函数的参数应该是指针,加[]指 指针所指的内容*/
scanf("%c",&c); /*这里输入的是要删除的字符吗*//*对的,估计这代码不是你写的吧,如果是初学者,建议看一些带注释的代码*/
delete_string(str,c); /*为什么括号里面加个[]就是错的呢?*//*同enter_string*/
printf_string(str); /*为什么括号里面加个[]就是错的呢?*//*同enter_string*/
system("pause");
return 0;
}
void enter_string(char str[80])
{
gets(str);
}
void delete_string(char str[80],char ch)
{
int i,j;
for(i=j=0;str[i]!='\0';i++) /*这个str[i]!='\0'是什么意思*//*翻译一下,str是字符串数组的头指针,i是数组下标,str[i]代表字符串数组str的第i个元素,‘\0’是转义字符,代表字符串的结尾。so,这句话的意思是,字符串数组str的第i个元素不等于字符串结尾*/
{
if(str[i]!=ch)
{
str[j++]=str[i];
}
}
str[j]='\0'; /*这个str[i]!='\0'是什么意思*//*同str[i]*//*这个语句是j不是i,是给修改后的字符串加结束标志用的*/
}
void printf_string(char str[])
{
printf("%s\n",str); /*这里输出的是str[i]还是str[j]啊?*//*都不是,输出的是str字符串数组的内容*/
}
总结:你的问题表明了两个学习的问题1、字符串数组、指针的概念不是太明白
//char str[80] ;声明了一个长度为80的字符串数组str,str既是字符串数组名称,又是该字符串数组的头指针。指针就类似淘宝购物的收货地址,按图索骥,就可以找到字符串中的内容。
[]运算符的使用和整数数组的使用其实是相同的,str[i]指str字符串数组的第i个元素,另一种写法是*(str+i).
'\0'是转义字符,代表字符串数组的结束。举例:
str[34]="abc";实际依次存储的字符是a,b,c,'\0',
2、函数传参的概念有点混淆。这个,我也是似懂非懂的,建议你看看谭老的书吧
最后,我后来不怎么写程序了,指针的概念确实不好理解而且容易出问题,建议你考虑下学习JAVA,它摒弃了指针。
对追问的回答:
对该核心代码块的算法的理解:
1、i代表原字符串的遍历下标,j代表处理后的字符串下标,上述处理都在同一地址空间进行
2、算法流程:
2.1循环初始化:i=j=0,指向字符串数组第一个字符;
2.2循环判断条件:str[i]未到字符串尾(指遍历str)
2.3开始循环:
若str[i]不等于欲删除的字符,应将该字符存入处理后的字符串,并把处理后的字符串下标加1,即str[j++]=str[i];
2.4循环结束,此时j指向的即是处理后的字符串数组的尾。但是,该位置存放并不总是字符串结束标志'\0',需要人工结尾。
2.5str[j]='\0';人工添加字符串结束标志。
#include
int main()
{
extern void enter_string(char str[]);
extern void delete_string(char str[],char ch);
extern void printf_string(char str[]);
char c,str[80];
enter_string(str); /*为什么括号里面加个[]就是错的呢*/ //[]只在声明数组和取数组中元素时才使用,这里要访问的是数组首地址 所以不必加[] 以下同
scanf("%c",&c); /*这里输入的是要删除的字符吗*/ //对
delete_string(str,c); /*为什么括号里面加个[]就是错的呢?*/
printf_string(str); /*为什么括号里面加个[]就是错的呢?*/
system("pause");
return 0;
}
void enter_string(char str[80])
{
gets(str);
}
void delete_string(char str[80],char ch)
{
int i,j;
for(i=j=0;str[i]!='\0';i++) /*这个str[i]!='\0'是什么意思*/ // str[i]就是取数组第i个位置的元素,字符串是以'\0'结尾的 这里的意思就是从字符串str最开始一直遍历到最后一个字符
{
if(str[i]!=ch)
{
str[j++]=str[i];
}
}
str[j]='\0'; /*这个str[i]!='\0'是什么意思*/ //在字符串最后加上结尾标志 '\0'
}
void printf_string(char str[])
{
printf("%s\n",str); /*这里输出的是str[i]还是str[j]啊?*/ //这里输出的是整个字符串str,不是某一个字符