请告诉我为什么两张图片的输出不同?

时间:2017-07-15 11:47:48

标签: c string

此程序接受5个字符串并打印它们。 这是程序: -

#include"stdio.h"
#include"conio.h"
void main(){
    clrscr();
    char s[5];
    for(int i=0;i<5;i++){
        scanf("%s", s[i]);
    }
    for(i=0;i<5;i++){
        printf("\n\n%s", s[i]);
    }
    getch();
}

当我执行这个程序时,输出将是这个

Click here to see the output of the program

但是当我以不同的方式输入字符串时,它会输出错误的输出

Click here to see the output of the program

2 个答案:

答案 0 :(得分:1)

您正在将字符串读入char中,或者更确切地说,您读取的字符串从s中的char位置开始。由于s非常短(当i为5时为空),会出现溢出,导致未定义的行为。

你想要一个字符串数组,而不是字符数组,正如Blue Pixy在他的评论中提到的那样,例如: char s[5][32];

同时打开警告。第二个for循环中的i未定义。

答案 1 :(得分:1)

您已将s声明为char的5元素数组;每个s[i]可以存储单个字符值,而不是字符串。由于您未明确初始化每个s[i],因此它们包含不确定值。

%s中的scanf说明符对应的参数必须为char *类型(每个s[i]的类型为char),且必须指向char数组的第一个元素,足以存储字符串内容(包括标记字符串结尾的0终结符)。

致电时

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

您告诉scanf将非空白字符的下一个序列存储到与{{1}中存储的对应的地址},这是a)不确定和b)可能无效。产生的行为是 undefined ,意味着几乎任何事情都可能发生 - 你的代码可能会按预期工作,它可能会彻底崩溃,它可能会给你带来乱码输出,它可能会破坏其他数据等等。

如上所述,s[i]可以存储最多4个字符的字符串。

如果要存储字符串的数组,则s必须是s的二维数组:

char

每个#define MAX_STRING_LENGTH 20 // or however long you expect your longest string to be ... char s[5][MAX_STRING_LENGTH + 1]; 现在可以存储最多s[i]个字符的字符串。您的其余代码现在应该按预期运行。