mxwawaawxm 发表于 2020-2-5 21:45

C语言指针求问

本帖最后由 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二级指针,我只移动了一次,为什么会出现这种情况{:301_979:}
中间遍历,偏移的是(*str_point)++

#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;
}

bp946 发表于 2020-2-5 22:14

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

庞晓晓 发表于 2020-2-5 22:18

我的爱是你 发表于 2020-2-5 22:23

本帖最后由 我的爱是你 于 2020-2-5 22:26 编辑

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踢出来或去除。这个判断还有点用。

fhxylang 发表于 2020-2-5 22:25

同来学习

photor 发表于 2020-2-5 22:44

你的遍历跳出条件就是遇到非数字跳出,所以此时指针在g90位置上,这时打印指针值当然就是g90了,跟踪调试一下就清楚

倾情 发表于 2020-2-5 22:55

我的爱是你 发表于 2020-2-5 22:23
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
*strs代表的是:123中1的地址,以%s输出就是123
**strs代表的是strs的值了。
你可以吧二级字符指针看成一个二维数组要容易理解一些

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起作用吗{:301_979:}
菜鸟弄不明白

mxwawaawxm 发表于 2020-2-6 11:41

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

用Visual Studio调试吗
电脑比较差,用着Notepad++
页: [1] 2
查看完整版本: C语言指针求问