【问题标题】:What is the right way to explain this code? [closed]解释此代码的正确方法是什么? [关闭]
【发布时间】:2016-04-14 11:06:48
【问题描述】:

st 不应该是指向 char 的指针数组而不是指向 char 的指针吗?不明白后者for loop是怎么打印值的?

int main(void)
{
    char temp[256]; 
    char *st;
    for (int i = 0; i < 3; i++)
    {
       scanf("%s", temp);
       st= strdup(temp);
    }

    for(int i=0;i<3;i++)
    {
        printf("%s",st);
    }    
}

【问题讨论】:

  • "字符串不应该是指向 char 的指针数组而不是指向 char 的指针吗?"绝对不是,至少在 C 中。在 C 中,字符串表示为 字符数组 i> 在字符串末尾以空字符结尾。
  • 字符串可以是字符数组或指向第一个字符的指针。为什么需要一个指向字符的指针数组?您是否在想象一个字符串,其中每个字符可能位于完全不同的内存位置?
  • 人们会期望字符串位于连续的内存区域中,因此只有指向第一个字符的指针就足够了,所有其他字母都在该点和下一个 '\0' 字符之间。正确的? :)
  • @MikeCAT 我想你从字符串中误解了我的问题,我指的是我在这段代码中声明的那个指针。不管怎样,我编辑了它,你现在可以检查它
  • @Ria 你没有解释为什么你认为应该有一个指向字符的指针数组。您是否想象字符串中的每个字符都可能存储在完全不同的内存位置?此外,你没有解释你得到什么输出或你给出什么输入。所以很难弄清楚“我不明白后者 for 循环如何打印值?”是什么意思。你在说什么价值?

标签: c string pointers


【解决方案1】:

你可能想要这个:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char temp[256]; 
    char *st[3];     // array of three pointers to char

    for (int i = 0; i < 3; i++)
    {
       scanf("%255s", temp);   // prevents potential buffer overflow
       st[i] = strdup(temp);
    }

    for(int i = 0; i < 3; i++)
    {
        printf("%s\n", st[i]);
        free(st[i]);           // free strduped memory
    }
}

这个程序显示:

./a.out
11
22
33
11
22
33

而你的程序显示

./a.out
11
22
33
33
33
33

这是因为:

char *st;        // in your prog. you only declare one pointer

for (int i = 0; i < 3; i++)
{
   scanf("%s", temp);
   st= strdup(temp);   // here you overwrite the st pointer loosing
                       // the string strduped in the previous run of the loop
}

【讨论】:

  • @Ria 在你的程序中你有printf("%s",st); 在for 循环内。所以打印相同的字符串 3 次是很正常的。如果您在 for 循环内有 printf("Hello");,它将打印 3 次“Hello”。
猜你喜欢
  • 2019-05-04
  • 2010-11-22
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2011-12-25
相关资源
最近更新 更多