使用 Scanf() 获取字符串和整数的输入

时间:2021-02-11 14:24:54

标签: arrays c string scanf format-specifiers

我正在编写一个简单的 C 程序,以使用 const Home = () => { const [data, setData] = useState(); return ( <div className="home"> <search ></search> </div> ); } 获取用户对不同变量的输入,如下所示:

    const Search = () => {
        
        return ( 
            <div className="search">
                <input type="text" />
                <button>Search</button>
            </div>
         );
    }

正如预期的那样,此输出完全正常:

scanf()

但后来我也尝试为一个字符串数组取输入,如下(这里#include <stdio.h> int main(){ int a, b; scanf("%d %d", &a, &b); printf("%d\n",a); printf("%d\n",b); return 0; } 是一个字符串数组):

input: 10 23
output: 10
        23

现在输出出乎意料:

char c[2]

在这里,可以看出为变量 #include <stdio.h> int main(){ int a, b; char c[2]; scanf("%d %d %s", &a, &b, c); printf("%d\n",a); printf("%d\n",b); printf("%s\n",c); return 0; } 打印的值将是 input: 10 23 AM output: 10 0 AM ,而不是预期的 b。字符串数组的输入如何改变变量 0 的值?

有人可以帮忙弄清楚我做错了什么(当然是愚蠢的错误)?强调文字

1 个答案:

答案 0 :(得分:2)

您的 char c[2]; 变量不是一个足够大的数组,无法容纳 2 个字符的字符串加上所需的 nul-终止符。如果您知道输入将不超过 2 个字符,则更改为 char c[3]; 应该就足够了;但是,为了增加安全性,您可以限制 scanf 调用将读取的字符数,使用格式说明符 %2s(或者,更一般地说,对于 {{ 1}} 在该格式说明符中使用值 char buff[n];)。

就目前而言,您有未定义的行为 – 这可能包括覆盖为 n - 1 提供的值(使用零应该是 b-终止符)。