首页 > 解决方案 > 二维数组给出错误的输出

问题描述

在用户完成输入字符串并提及每个字符串的最大长度和总数字符串后,我正在编写一个代码来打印存储在二维数组中的所有字符串(它最终将打印字符串以及行号)。问题是代码实际上以一整行间距存储二维数组中的所有字符串,即一整行空行。代码、预期输出和它给出的输出如下。

代码:

#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

请纠正我在哪里做错了。

标签: cmultidimensional-arrayoutput

解决方案


您遇到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;      
}

推荐阅读