【问题标题】:Character array initialization using for loop使用 for 循环初始化字符数组
【发布时间】:2019-12-09 04:54:37
【问题描述】:

我们还需要初始化\0(NULL) 字符吗?

代码:

char S[N];
for (i = 0; i < N; ++i) {
  scanf("%c", & S[i]); //Is it a wrong way to initialize char string character by character?
}
for (i = 0; i < N; ++i) {
  printf("%d  %c", i, S[i]);
}

【问题讨论】:

  • 你应该检查scanf的返回值,并且可能还在printf格式字符串的末尾加上一个\n
  • 正如下面的答案中提到的,只要您在操作字符串时提供字符串的长度“N”,这将起作用。您不能使用标准字符串函数。行终止是如何检测字符串结尾的。这是一个坏方法吗?是的,如果你不小心的话。

标签: c


【解决方案1】:

这应该可行,并且您不必在末尾添加 NUL(不是 NULL,它是 ASCII),因为您将它视为 N 个不同字符的数组而不是字符串。如果你想用%s printf 它或在它上面调用strlen,那么你必须添加 NUL(并为数组分配 N+1 个字符)。

您应该在printf 格式字符串的末尾添加\n

请注意,您必须在一行中输入 N 个字符。例如,如果在第一个字符之后按回车,则换行符将被视为第二个字符。

【讨论】:

  • 所以如果我使用 string.h lib 函数,那么对于一个长度为 N 的字符串,我应该为 Char str[] 分配 N+1 个空间吗?
  • 是的,因为你最后需要\0。所以要存储“你好”,你需要char[6]
【解决方案2】:

只要有足够的数据可以从stdin 读取,您的代码就应该可以工作。您应该测试scanf() 的返回值以检测文件过早结束。由于您没有在格式字符串的末尾添加换行符,因此输出将被连接到一行。

这是一个更简单的方法,fread

#include <stdio.h>

int main() {
#define N 100;
    char S[N];
    int n = fread(S, 1, N, stdin);
    if (n < N) {
        printf("read error: only %d bytes read\n", n);
    }
    for (int i = 0; i < n; ++i) {
        printf("%d  %c\n", i, S[i]);
    }
    return 0;
}

【讨论】:

  • 我从字面上回答了关于数组是否可以使用scanf逐字符初始化的问题,但是如果您真的想将字符读入数组,这显然是一种更好的方法。
【解决方案3】:

如果您需要初始化一个字符数组,请写:char S[N] = {0}; -- 它将用零个字符进行初始化,如果您需要它们可以用作字符串终止符。

如果您需要读取字符串,只需使用 fread(buf, 1, N, stdin); 即可

总而言之,您的代码可能如下所示:

char S[N] = {0};
fread(buf, 1, N, stdin);

【讨论】:

  • 这个版本可能会溢出缓冲区,而原版不会
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
相关资源
最近更新 更多