字符串如何填充数组

时间:2017-02-16 10:12:08

标签: c arrays string

我正在创建一个简单的程序来查看字符串如何填充数组。

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

int main(void)
{
    char string1[100];
    int i;

    printf("Enter sentence.\n");
    fgets(string1, 100, stdin);

    for (i=0; i<=15; i++)
       puts(&string1[i]);
    return 0;
}

我在理解字符串填充数组时遇到了一些问题。我的期望是字符串将完全存储在string1 [0]中,并且任何其他索引将显示为空白。但是,当我抛出循环以查看我的假设是否为真时,事实证明每个索引都已被字符串填充。我误解了字符串是如何填充数组的吗?

3 个答案:

答案 0 :(得分:2)

对于字符串“Hello!”,内存表示将类似于此

+-------+-------+-------+-------+-------+-------+-------+
|  'H'  |  'e'  |  'l'  |  'l'  |  'o'  |  '!'  | '\0'  |
+-------+-------+-------+-------+-------+-------+-------+  

索引为0的第一个单元格包含第一个字符。并且每个后续字符都包含在索引增加的单元格中。

puts这样的库函数希望您传递第一个字符的地址,然后他们将字符串读取到\0

因此,如果您只是通过string1&string1[0],则会解析为'H'的地址。

如果您通过&string[1],它将解析为'e'的地址,并且库函数会认为 是第一个字符,因为这是合同C字符串用。来设计。

答案 1 :(得分:1)

字符串未存储在string1 [0] 中,但字符串的第一个字符存储在string1[0]或字符串从{{1}开始}。这里,(string1+0)可以看作指针,指向C String &string1[0] or (string1+0)的指针。

从这个意义上讲,string1的每个有效索引i都会为您提供一个有效的指针string1,它将指向C String (string1 + i)的某些部分。

在最后一个for循环中,您将打印由string1指向的字符串string1的后缀...

答案 2 :(得分:1)

您的问题本身不是string1布局,而是puts如何解释它。字符串由C中的char数组表示,而它们的结尾标记为空终止符(代码为0的字符):

 S e n t e n c e \0
 ^         ^
 string1   &string1[5]

&string1[5]是指向一个字符的指针,但由于后面的字符不是空终止符,因此后续内存被解释为字符串并且nce被打印。

您需要使用putc并访问单个字符:

putc(string1[i])