“01234 | MY_NAME”=“%s |%s”?

时间:2018-01-09 18:46:43

标签: c scanf

我无法理解这个结果:

    fscanf(FILE,"%s|%s", str1, str2);
    printf("Number:%s, Name:%s", str1, str2);

文件内容:

 01234|MY_NAME

预期产出:

 Number:01234, Name:My_NAME

输出:

 Number:01234|MY_NAME, Name:╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠01234|MY_NAME

有人可以解释为什么它会提供输出吗?

P / s:我用这段代码解决了它:

    fscanf(FILE,"%[^|]|%[^|]", str1, str2);
    printf("Number:%s, Name:%s", str1, str2);

但我仍然不明白为什么“%s |%s”给出了之前的输出。

1 个答案:

答案 0 :(得分:0)

%s指令告诉fscanf跳过任何初始空格并将1个或多个非空白字符读入参数char *

01234|MY_NAME非空格,因此最终会被第一个str1放入%s

然后格式字符串中的|告诉fscanf读取文字|字符。这会失败,因为没有输入。此时fscanf放弃并返回1以表示它已成功填充其中一个变量。

但是,您的程序会忽略fscanf的返回值,因此它不会意识到发生了什么。它会盲目输出str1(包含01234|MY_NAME)和str2(未初始化并打印垃圾,直到它在内存中找到'\0'为止。