【问题标题】:please tell me why does the output of the two picture is different? [closed]请告诉我为什么两张图片的输出不同? [关闭]
【发布时间】:2017-12-20 10:23:17
【问题描述】:

这个程序接受 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

【问题讨论】:

  • 你的代码应该做什么?为什么第一个是对的,第二个是错的?您不能只显示代码和图片而不告诉我们它应该如何工作
  • char s[5]; --> char s[5][32];, for(i=0;i&lt;5;i++){ --> for(int i = 0; i &lt; 5; i++){
  • 1.请张贴文本和大量链接到文本图像。 2. 缩进您的代码以使其可读。 3.输入是什么
  • scanf("%s", s[i]) 中,您要求编译器生成代码以读取字符串("%s")并将该字符串放在无效位置(s[i] 是@987654331 类型的值@)。你需要解决这个问题(以及其他小问题)
  • @EdHeal“很多链接”真的很混乱。您显然是指“不是链接”...

标签: c string


【解决方案1】:

您已将s 声明为char 的5 元素数组;每个s[i] 可以存储一个单个 字符值,而不是字符串。由于您没有显式初始化每个 s[i],它们包含一个 indeterminate 值。

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

当你打电话时

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

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

正如所写,s 可以存储长达 4 个字符的字符串。

如果要存储字符串的数组,那么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] 现在可以存储一个字符串,最多为MAX_STRING_LENGTH 个字符。您的其余代码现在应该按预期运行。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 很抱歉告诉你,但这不是我所期望的答案
    • 好吧,用户,原因是存在未定义的行为,这意味着行为未定义,因此很可能输出错误或不同,或者您遇到段错误或其他任何问题.如果您修复程序的错误,它将按预期提供输出。无法推理未定义的行为。
    猜你喜欢
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    相关资源
    最近更新 更多