【问题标题】:How to store multiple strings in a 2-D array? [duplicate]如何在二维数组中存储多个字符串? [复制]
【发布时间】:2019-11-18 09:23:58
【问题描述】:

我想编写一个 C 程序,它在运行时存储一堆句子,并在程序结束时将它们打印出来。 这是我写的:

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

int main(){
    int counter = 0;
    char state[100][200];
    char stroo[3] = "yes";
    sprintf(state[counter], "%s", stroo);
    counter++;
    char poo[2] = "44";
    sprintf(state[counter], "%s", poo);
    counter++;
    for (int i=0; i<counter; i++) {
        printf("%s\n", state[i]);
    }
    return 0;
}

对于输出,第一行打印“是”,这是我的预期。然而,第二行打印“44yes”。为什么打印“yes”和“44”?

【问题讨论】:

  • 我们现在有一个缺少空终止符的常见问题解答。链接为重复。
  • 出现意外输出的原因是,字符数组 stroo 和 poo 都不是以 null 结尾的。此外,在第二行中获得“44yes”的原因是堆栈内存正在向下增长并且字符数组已被分配连续的内存位置。

标签: c arrays string c11


【解决方案1】:

那是因为你的字符串没有正确地以空值结尾,所以你在sprintf 遇到了未定义的行为。这是因为缓冲区太小而无法容纳空终止符。例如这里:

char stroo[3] = "yes";

您需要四个字符的内存,'y'、'e'、's' 和空终止符。改成

char stroo[4] = "yes";

同样char poo[2] 必须是char poo[3]。

见here(强调我的):

字符串文字的连续字节或宽字符串文字的宽字符,包括终止的空字节/字符,初始化数组的元素[...] 如果数组的大小已知,则可能比字符串文字的大小小一,在这种情况下,终止空字符将被忽略:

如果您希望大小自动足够大以完全适合字符串,您可以省略大小规范:

char stroo[] = "yes";

当然,对于这个例子,你甚至不需要将字符串复制到堆栈中:

char *stroo = "yes";

【讨论】:

  • 最好只删除这些的尺寸规格。例如char stroo[] = "yes"; 将自行分配必要的大小。
【解决方案2】:
#define STRINGS 5
#define STRING_SIZE 50

char arr[STRINGS][STRING_SIZE] =
{ "Hi",
  "Hello world",
  "Good morning",
  "ASDF",
  "QWERTY"
};

for (int i=0; i<STRINGS; i++) {
    printf("%s\n", arr[i]);
}

【讨论】:

    猜你喜欢
    • 2013-01-10
    • 2019-08-10
    • 2010-10-16
    • 2015-06-12
    • 2021-07-10
    • 1970-01-01
    • 2017-09-06
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多