gpt4 book ai didi

c - 将字符串视为二维字符数组

转载 作者:行者123 更新时间:2023-11-30 14:47:36 31 4
gpt4 key购买 nike

我想要一个代码,以便我可以逐一输入一些字符串(按 Enter 键)并显示它。例如;

输入

abc
def

输出

abc    
def

我还希望这个输入位于数组中,以便我可以选择任何字符

只要我需要就可以从数组中获取。例如:s[1][1] 给出“e”。

我已经为这个问题编写了代码。

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

int main()
{
int i, j, n, m;

scanf("%d%d", &n, &m);
char a[n][m];

for (i = 0; i<n; i++)
scanf("%s", a[i]);


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

但是对于这段代码,我的输入/输出如下所示:

输入

ab
cd

输出

abcd
cd

谁能告诉我哪里错了?

最佳答案

您没有在问题中显示nm的输入值。但从显示的输入和输出字符串来看,char数组a[i]似乎没有足够的空间来终止空字符\0.当您提供格式说明符 %s 时,scanf() 会自动在存储序列的末尾添加一个终止空字符。我用输入 2 尝试了 nm 的代码,并且得到了与您相同的输出:

$ ./a.out
2 2
ab
cd
abcd
cd

将值4赋予m,输出为:

2 4
ab
cd
ab
cd

当使用 scanf() 进行字符串输入时,最好添加对小于输入缓冲区长度 1 的最大字符修饰符的检查。因此,如果输入缓冲区的大小是 4 那么你可以这样做

scanf("%3s",a[i]);

这样,scanf() 将读取 a[i] 中不超过 3 个字符,并添加 \0位于a[i]的第四个位置。请注意,它不会丢弃输入流中的剩余输入,它们将被连续的 scanf() 调用消耗。

如果您想删除 scanf 未消耗的额外输入,一种方法是使用循环读取并丢弃额外输入,如下所示:

int c;
while((c = getchar()) != '\n' && c != EOF)
/* discard the character */;

您可以在 scanf() 从输入流读取数据后添加它,如下所示:

    for(i=0; i<n; i++) {
scanf("%3s", a[i]); // assuming the size of a[i] is 4
int c;
while((c = getchar()) != '\n' && c != EOF) // <=== This loop read the extra input characters and discard them
/* discard the character */;
}

这对于不包含任何空白字符的输入来说效果很好。如果您的输入包含任何空白字符,它可能不会按预期运行。因此,我建议您阅读fgets(),它可以让您更好地控制字符串输入。

检查这个:fgets
这是:How to read from stdin with fgets()?

关于c - 将字符串视为二维字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51100110/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com