使用scanf()函数

时间:2013-04-04 13:59:17

标签: c scanf

我打算修改特定字符串的每个其他字母。但就本计划而言,这一切都不会发生。到目前为止,我已经从用户那里抓取了一个字符串并将其存储在userinput中,并打算将其打印出来。

#include <stdio.h>
#include <string.h>

int main(void) {    
char userinput[256] ="";
printf("Enter somthing to change:\n");
scanf("%s", &userinput);
printf("%s\n", userinput);

int k = 2; // This is just here to do something every time k is even
int j = strlen(userinput);
for (int i = 0; i < j; i++) {

    if(k % 2 == 0) {
        printf("%s", userinput[i]);
        k++;
    }
    else {
        printf("%s", userinput[i]);
        k++;
    }
}

}

strlen()函数不适用于userinput。我认为这是因为strlen()应该获取字符串的第一个字符的地址,然后迭代直到达到空字符,但scanf实际上不会创建空字符。 在没有先知道字符串的长度的情况下,我无法找到在字符串后添加'\0'的方法。

如果存储的字符序列存储在数组中,我将如何访问存储字符序列的长度?

4 个答案:

答案 0 :(得分:8)

此:

scanf("%s", &userinput);

应该是:

scanf("%s", userinput);

运营商&的地址是不需要的,也是不正确的。传递给函数时,数组会衰减到第一个元素的地址。 scanf("%s")将附加一个空终止字符,因此不必显式插入一个。

为防止潜在的缓冲区溢出,请指定scanf()应写入userinput的最大字符数。这应该小于userinput的大小,为终止空字符留出空间:

scanf("%255s", userinput);

正在使用不正确的格式说明符(未定义的行为)来打印char的{​​{1}}个词:使用userinput而不是%c。这样:

%s

必须是:

printf("%s", userinput[i]);

答案 1 :(得分:1)

更改此

scanf("%s", &userinput);

scanf("%s", userinput);

我们必须使用scanf的地址:

  • 如果我们要扫描到int a,那么我们必须使用地址scanf() =&gt;来呼叫a &a
  • 如果我们要扫描到double a,那么我们必须使用地址scanf() =&gt;来呼叫a &a
  • 但是如果我们将使用指针(内存地址)int *a;或char数组char a[50];扫描数据,那么我们必须使用指针或数组调用scanf()而不添加{{ 1}}

来自scanf()页面

  

根据格式字符串,函数可能需要一系列   附加参数,每个参数包含指向已分配存储的指针   其中存储了提取字符的解释   适当的类型。至少应该有这么多   arguments作为格式说明符存储的值的数量。   函数忽略其他参数。这些论点是   期望成为指针:将scanf操作的结果存储在a上   常规变量,其名称前面应该有引用   运算符(&amp;)(参见示例)。

答案 2 :(得分:1)

更改

scanf("%s", &userinput);

scanf("%s", userinput);

在字符串捕获的情况下,不需要&运算符。 scanf()自动将空字符('\0')附加到字符串的末尾,因此int j = strlen(userinput);应该有效。

如果您仍然希望在没有此功能的情况下有效地计算长度,则链接How to calculate the length of a string in C efficiently?

答案 3 :(得分:1)

正如其他人所指出的那样,你对类型感到困惑。当你对类型感到困惑时使用scanf和printf很危险!

  

scanf(“%s”,&amp; userinput);

&userinput的类型为char (*)[256],但scanf希望%schar *对应。由于期望的类型和给定的类型不同,并且不需要具有相同的表示,因此行为未定义。

  

我认为这是因为strlen应该采用的是地址   字符串的第一个字符,然后迭代,直到达到null char但是   scanf实际上并不创建空字符。

错误。当您使用%s格式说明符时,scanf肯定会分配一个空字符。也就是说,提供scanf不会遇到错误或EOF。在这方面,你应该检查来自scanf的错误:

if (scanf("%s", userinput) != 1) {
    /* Insert error handling here */
}

...正如你应该使用C中的所有标准库函数一样。

k毫无意义。您的循环已经以与i相同的频率递增k

strlen返回size_t。确保以正确的类型存储返回值。如果函数返回size_t,则将返回值存储在size_t中。如果函数返回int,则将返回值存储在int中。得到它了?无论返回类型是什么,都是用于存储返回类型的任何类型。使用手册找出它。

  

printf("%s", userinput[i]);

再次出现类型混乱。 userinput[i]char%s告诉printf期待char *。如果参数无效,则行为未定义。这可能会导致您的程序出现故障。考虑printf("%c", userinput[i]);printf("%s", &userinput[i]);