吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1234|回复: 15
收起左侧

[已解决] C语言指针求问

[复制链接]
mxwawaawxm 发表于 2020-2-5 21:45
本帖最后由 mxwawaawxm 于 2020-2-13 19:28 编辑

源代码如下
定义了一个字符串数组string
再定义二级指针str_point指向字符串数组string
指针偏移str_point++;
遍历第2个字符串的每个字符,isdigit(**str_point)判断字符是否数字字符。如果不是数字字符,跳出循环
我在遍历前,打印了第2个字符串printf("%s\n", *str_point);
能全部显示"678g90"
在遍历后,再以同样的代码打印printf("%s\n", *str_point);
只能打印后半段g90
str_point二级指针,我只移动了一次,为什么会出现这种情况
中间遍历,偏移的是(*str_point)++
2020-02-05_213556.png
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <ctype.h>

int main(int argc, const char *argv[])
{
    char *string[] = {"12345", "678g90"};
    char **str_point = string;
    
    str_point++;
    
    printf("%s\n", *str_point);
    while (**str_point!='\0') {
        printf("%c\n", **str_point);
        if (!isdigit(**str_point)) {
            break;
        }
        (*str_point)++;
    }
    
    printf("*str_point = %s\n", *str_point);
    
    return 0;
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
庸人误我 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bp946 发表于 2020-2-5 22:14
这不是正常吗,17行你都把地址移到g了,你再打印就是从g开始,while(12行)之前定义一个临时变量保存*str_point,while里的变量改成临时变量即可

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
mxwawaawxm + 1 + 1 谢谢@Thanks!

查看全部评分

头像被屏蔽
庞晓晓 发表于 2020-2-5 22:18
我的爱是你 发表于 2020-2-5 22:23
本帖最后由 我的爱是你 于 2020-2-5 22:26 编辑

[C] 纯文本查看 复制代码
int main(int argc, const char* argv[])
{
const char* string[] = { "12345", "678g90" };
const char** str_point = string;
str_point++;
int i = 0;
printf("%s\n", *str_point);
while (**str_point != '\0') 
{
  printf("%c\n", **str_point);
  if (!isdigit(**str_point))
  {
   break;
  }
  (*str_point)++;
  i++;
}
*str_point = (*str_point) -i;
printf("*str_point = %s\n", *str_point);
return 0;
}

或者直接定一个i也行,指针右移多少次就左移回来多少次。
说实话我并不知道你的if有啥用,如果要把g踢出来或去除。这个判断还有点用。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
mxwawaawxm + 1 + 1 谢谢@Thanks!

查看全部评分

fhxylang 发表于 2020-2-5 22:25
同来学习
photor 发表于 2020-2-5 22:44
你的遍历跳出条件就是遇到非数字跳出,所以此时指针在g90位置上,这时打印指针值当然就是g90了,跟踪调试一下就清楚

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
mxwawaawxm + 1 + 1 热心回复!

查看全部评分

倾情 发表于 2020-2-5 22:55
我的爱是你 发表于 2020-2-5 22:23
[mw_shl_code=c,true]int main(int argc, const char* argv[])
{
const char* string[] = { "12345", "67 ...

输出正常,没得问题啊,因为你的指针加加了,肯定只有g90。,深夜回复,没毛病小熊弟
庸人误我 发表于 2020-2-5 23:11
举个简单的例子:
char * str= "abcde";
str+1:代表字符b的地址;

char ** strs = {"123", "456"};
strs代表:&strs[0]
*strs代表的是:123中1的地址,以%s输出就是123
**strs代表的是strs[0][0]的值了。
你可以吧二级字符指针看成一个二维数组要容易理解一些

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
mxwawaawxm + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| mxwawaawxm 发表于 2020-2-6 11:40
bp946 发表于 2020-2-5 22:14
这不是正常吗,17行你都把地址移到g了,你再打印就是从g开始,while(12行)之前定义一个临时变量保存*str_po ...

我是想不明白
str_point是二级指针
我17行的代码 (*str_point)++;
自增的不是 (*str_point),这也会对str_point起作用吗
菜鸟弄不明白
 楼主| mxwawaawxm 发表于 2020-2-6 11:41
photor 发表于 2020-2-5 22:44
你的遍历跳出条件就是遇到非数字跳出,所以此时指针在g90位置上,这时打印指针值当然就是g90了,跟踪调试一 ...

用Visual Studio调试吗
电脑比较差,用着Notepad++
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 20:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表