C语言 最后一个printf有什么问题,它不打印带有空格和符号的字符串

cld4siwp  于 2023-03-29  发布在  其他
关注(0)|答案(1)|浏览(187)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() 
{
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
    char ch;
    char s[100];
    char sen[100];
    scanf("%c", &ch);
    scanf("%s", s);
    scanf("%[^\n]%*c", sen);
    printf("%c\n", ch);
    printf("%s\n", s);
    printf("%s\n", sen);  
    return 0;
}

//输入

  • C
  • 简体中文
  • 欢迎来到C!!

我没有得到最后一个printf的输出。这里有什么问题吗?

jxct1oxe

jxct1oxe1#

输入为
一米零一米零一米零一米零一米零一米零一米零一米零一米零二米零一米零。
scanf("%c", &ch);读取"C""\nLanguage\nWelcome To C!!\n"保留。"%c"读取/保存1个字符。
scanf("%s", s);读取"\nLanguage""\nWelcome To C!!\n"保留。"%s"读取/丢弃前导空格并读取/保存无限的非空格字符,然后将 *null字符 * 附加到s
scanf("%[^\n]%*c", sen);读取 nothing. "\nWelcome To C!!\n"保留。"%[^\n]%*c"立即停止,因为第一个可用字符是'\n',并且不在扫描集中[^\n]sen不变。
最后printf有什么问题
printf("%s\n", sen);尝试从未分配的sen数组打印,导致 undefined behavior(UB)。
这里会有什么问题呢?

scanf()的返回值有3处检查失败

有了if (scanf("%[^\n]%*c", sen) != 1) puts("Error");,它会变得很清楚,什么都没有读.

使用"%s""%[^\n]"不带宽度

scanf("%s", s);有输入溢出的风险。使用类似scanf("%99s", s);的宽度和char s[100];
还可以更改代码以使用前导空格。

// scanf("%[^\n]%*c", sen);
//         v---- Note space.
if (scanf(" %99[^\n]%*c", sen) != 1) {
  puts("Error");
}

更好的是,停止使用scanf(),而使用fgets()来处理所有用户输入。

相关问题