【问题标题】:how to handle pointer in for loop如何处理for循环中的指针
【发布时间】:2019-09-14 21:26:39
【问题描述】:

这会引发错误 id 返回 1 错误状态。循环正在工作,但我无法打印最终的连接字符串。当我尝试打印最终的字符串时,它什么也不做。

char str1[50], str2[50], str[100];
char *p1, *p2, *p3;
int i = 0, j = 0;

p1 = &str1[0];
p2 = &str2[0];
p3 = &str[0];

printf("enter a string:");
gets(str1);

printf("enter a string:");
gets(str2);

while (i <= strlen(str1) + strlen(str2)) {
    if (i != strlen(str1)) {
        *(p3 + i) = *(p1 + i);
        i++;
    } else {
        *(p3 + i) = *(p2 + j);
        j++;
    }

【问题讨论】:

标签: c string loops pointers strlen


【解决方案1】:

这里的检查是错误的:

if(i!=strlen(str1))

i 大于strlen(str1) 时,它会再次变为假,但它应该保持为真。改成这样:

if (i < strlen(str1))

此外,您不会在 else 块中增加 i。这将导致j 不断增长的无限循环,至少直到未定义的行为会导致您的程序退出,可能是通过访问冲突。试试这个:

else {
    *(p3 + i) = *(p2 + j);
    i++; // increase i in both cases
    j++;
}

或者更好的是,让它成为无条件的。例如,您可以将 i++ 从正文中取出,将循环更改为:

for (i = 0; i <= strlen(str1) + strlen(str2); i++)

另外,我可以对数组下标表示法感兴趣吗?而不是这个:

if (i < strlen(str1)) {
    *(p3 + i) = *(p1 + i);
}

这样做:

if (i < strlen(str1)) {
    p3[i] = p1[i];
}

这种方式更简洁,使用您的代码的人会喜欢它。

【讨论】:

  • // increase i in both cases..不如说是无条件的。
  • 请建议使用数组下标符号:p3[i] & p2[j]
  • @SouravGhosh 好主意。我编辑了答案,包括建议一个​​带有i++for 循环,我想这将是一个干净的方法。
  • @machine_1 很棒的建议,将其添加到答案中。我不得不承认,查看 *(p3 + i) = *(p1 + i) 构造需要一些时间才能弄清楚发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多