c - 二维数组给出错误的输出
问题描述
在用户完成输入字符串并提及每个字符串的最大长度和总数字符串后,我正在编写一个代码来打印存储在二维数组中的所有字符串(它最终将打印字符串以及行号)。问题是代码实际上以一整行间距存储二维数组中的所有字符串,即一整行空行。代码、预期输出和它给出的输出如下。
代码:
#include <stdio.h>
int main() {
char s[20][30];
int i, number_of_strings, length_of_string, j = 0;
scanf("%d %d", &number_of_strings, &length_of_string);
for (i = 0; i<number_of_strings; i++) {
while ((s[i][j++] = getchar()) != '\n' && j<length_of_string)
s[i][j] = '\0';
j = 0;
}
for (i = 0; i<number_of_strings; i++) {
printf("i= %d %s\n", i, s[i]);
}
return 0;
}
样本输入:
2 3
raj
jar
预期输出:
i= 0 raj
i= 1 jar
输出给出:
i= 0
i= 1 raj
i= 2
i= 3 jar
请纠正我在哪里做错了。
解决方案
您遇到了scanf
. 在这种情况下scanf("%d %d", ...)
,在缓冲区上留下换行符。你可以让它在尾随空格中啜饮,最后有一个空格。
scanf("%d %d ", &number_of_strings , &length_of_string);
那么你如何阅读一行是复杂的。您可以像这样简化它:
int c, j;
for(j = 0; (c = getchar()) != '\n'; j++ ) {
s[i][j] = (char)c;
}
s[i][j] = '\0';
或者更简单...
for(int i=0 ; i<number_of_strings ; i++) {
scanf("%29s", s[i]);
}
而且没有必要length_of_string
。事实上,这是一种责任,因为您最多只分配了 30 个字节。同样,number_of_strings
可以高于分配的 20。最好在输入或内存耗尽之前读取。
#include <stdio.h>
const int MAX_STRINGS = 20;
const int MAX_LENGTH = 30;
int main(){
char s[MAX_STRINGS][MAX_LENGTH];
int num_strings;
for(num_strings = 0; num_strings < MAX_STRINGS ; num_strings++) {
if( scanf("%29s", s[num_strings]) < 1 ) {
break;
}
}
for( int i = 0 ; i < num_strings; i++){
printf("i= %d %s\n",i,s[i]);
}
return 0;
}
推荐阅读
- javascript - 模具自定义页面 javascript 未触发
- node.js - Kafka 无法在 docker 上连接代理
- swift - 在调用 AudioObjectGetPropertyData 之前分配 UnsafeMutableAudioBufferListPointer
- php - 跨多个脚本的 PHP 无状态提供程序
- scala - mill client.fastOpt: client.scalaJSLinkerClasspath scala.MatchError: 1 (of class java.lang.String)
- android - 无法将 admob 与 firebase iOS/Android 项目链接
- json - 无法在python中打印包含多个数组值的json对象中的值
- mysql - MySQL 8.0 中的 MySQL SQL 文件奇怪的语法错误
- python-3.x - 使用负索引在Python中获取特定范围内的列表元素
- java - 了解 Java HashMap 的工作原理