| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1882 人关注过本帖
标题:指针数组和数组的区别
只看楼主 加入收藏
Feiyiyi1
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2017-10-22
结帖率:62.5%
收藏
已结贴  问题点数:20 回复次数:6 
指针数组和数组的区别
这是一个删除子串的函数,如果把char str1[]= "123456789";改为char *str1="123456789";对函数体怎么改才能实现同样的功能
程序代码:
#include <stdlib.h>
#include <stdio.h>

#define TRUE  1
#define FALSE 0

char *del_substr(char *str, char const *substr);

int main()
{
    char        str1[]= "123456789";
    char const  * str2= "345";
    printf("before delet:          %s\n", str1);
    printf("will delete the chars: %s\n", str2);
    del_substr(str1, str2);
    printf("After delete:          %s\n", str1);

    system("pause");
    return 0;

 }

char *del_substr(char *str, char const *substr)
{
    char const * subP;
    char *strP;
    char *temp;
    int  flag = TRUE;
    strP = str;

    if( (!*str) || *substr=='\0' )             //判断两个字符串是否有空字符串
       return FALSE;                           //(!*str)和*str=='\0'是等价的

    while(*strP)
    {
        temp = strP;
        subP = substr;
        for(; *subP; subP++)
        {
            if(*strP == *subP)
            {
                strP++;
                flag = FALSE;
                continue;
            }
            break;
        }

        if(*subP == '\0')
        {
            while(*temp++ = *strP++)
                ;
            break;
        }

        if(flag)
            strP++;
    }
    return TRUE;
}

搜索更多相关主题的帖子: 数组 char str const printf 
2017-11-01 15:00
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:8 
char *str1="123456789"

"123456789"是个常量字符串,就不可以传给可变的字符指针
之所以编译不报错,那是因为const是后来才加入到C标准中去的,为了兼容大量的旧有代码,就不编译失败了。但无论在以前,还是在现在,修改常字符串都是未定义行为。
总之吧,如果你在古老的代码看到 char *str1="123456789",不要嘲笑代码作者,因为那时候没有const,而且作者自己会保证不去修改他;如果你在当今的代码中看到 char *str1="123456789",告诉你boss,该开除的就得开除


2017-11-01 15:19
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:12 
    //试了一下,好象有差别。(TDM-GCC 4.9.2 32-bit Release)
    char *s1="123456789";
    const char s2[]="123456789";
    //s1[0] = '9'; //出错
    //s2[0] = '9'; //出错
    char *p;
    p = (char *)s1;
    //p[0] = '9'; //出错
    p = (char *)s2;
    p[0] = '9'; //不出错
    p[8] = '1';
    printf("%.9s\n", s2);
2017-11-01 16:07
Feiyiyi1
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2017-10-22
收藏
得分:0 
回复 3楼 吹水佬
谢谢诶  那你看一下我这个换成 char str1[]定义  但是printf("%s\n",rever);这个怎么输出不了,,谢谢  
程序代码:
#include <stdlib.h>
#include <stdio.h>

void reverse_string(char *str2);
int main()
{
    char   str1[]= "123456789";
    printf("before delet :          %s\n", str1);
    reverse_string(str1);

    system("pause");
    return 0;
}
void reverse_string(char *str2)
{
    char *rever;
    int   count;
    count=strlen(str2);
    printf("%d\n",count);
    for(;count>-1;count--)
        *rever++=*(count+str2);
    printf("%s\n",rever);
}

2017-11-01 16:48
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 4楼 Feiyiyi1
    char *rever;
    for(; count>-1; count--)
        *rever++=*(count+str2); //rever未定义
试试:
    char rever[100];
    char *p=rever;
    for(; count>-1; count--)
    {
        *p++ = *(count+str2);
    }
    *p = '\0';

        

2017-11-01 16:58
Feiyiyi1
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2017-10-22
收藏
得分:0 
回复 5楼 吹水佬
谢谢诶
你写的这个不可以
会有警告,而且输出不了
警告:
/home/zhangfeifei/文档/qt学习/明解c语言/print-6/main.c:298: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
     *p=a;
       ^

我找了一下最后把*p前面的*拿掉 结果就可以了
程序代码:
#include <stdio.h>
#include <string.h>
void reverse_string(char *str2);
int main()
{
    char   str1[]= "12345678";
    printf("before delet :          %s\n", str1);
    reverse_string(str1);
    system("pause");
    return 0;
}
void reverse_string(char *str2)
{
    char  *p;
    char   a[20];
    *p=a;
    int   count;
    count=strlen(str2);
    printf("%d\n",count);
    printf("最后一个字符:%c\n",*(str2+count-1));
    for(;count>-1;count--)
        *p++=*(count+str2-1);
    *p='\0';
    printf("%s\n",a);
}

2017-11-01 20:23
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用Feiyiyi1在2017-11-1 20:23:03的发言:

谢谢诶
你写的这个不可以
会有警告,而且输出不了
警告:/home/zhangfeifei/文档/qt学习/明解c语言/print-6/main.c:298: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
     *p=a;
       ^
我找了一下最后把*p前面的*拿掉 结果就可以了
#include <stdio.h>
#include <string.h>
void reverse_string(char *str2);
int main()
{
    char   str1[]= "12345678";
    printf("before delet :          %s\n", str1);
    reverse_string(str1);
    system("pause");
    return 0;
}
void reverse_string(char *str2)
{
    char  *p;
    char   a[20];
    *p=a;
    int   count;
    count=strlen(str2);
    printf("%d\n",count);
    printf("最后一个字符:%c\n",*(str2+count-1));
    for(;count>-1;count--)
        *p++=*(count+str2-1);
    *p='\0';
    printf("%s\n",a);
}

这句要改改:
//*p=a;
p=a;

直接用指针还可以这样:
void reverse_string(char *str2)
{
    char a[1024]={0}; //要足够大
    char *pd, *ps;
    for(pd=a,ps=str2+strlen(str2)-1; ps>=str2; --ps,++pd)
        *pd = *ps;
    printf("%s\n",a);
}
或用首尾指针减少循环次数
void reverse_string(char *str2)
{
    char a[1024]={0};
    char *pd1, *pd2, *ps1, *ps2;
    ps1 = str2;
    ps2 = str2+strlen(str2)-1;
    pd1 = a;
    pd2 = a+(ps2-ps1);
    for(; ps1<=ps2; ++ps1,--ps2,++pd1,--pd2)
    {
        *pd1 = *ps2;
        *pd2 = *ps1;
    }
    printf("%s\n",a);
}
2017-11-02 06:10
快速回复:指针数组和数组的区别
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029905 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved