此程序接受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
但是当我以不同的方式输入字符串时,它会输出错误的输出
答案 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]
个字符的字符串。您的其余代码现在应该按预期运行。