使用scanf()函数
我打算修改特定字符串的每个其他字母。 但就本计划而言,这一切都不会发生。 到目前为止,我已经从用户那里获取了一个字符串并将其存储在userinput
并打算打印它。
#include #include 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'
的方法。
如果存储在数组中,我将如何访问存储的字符序列的长度?
这个:
scanf("%s", &userinput);
应该:
scanf("%s", userinput);
运营商的地址是不需要的,也是不正确的。 传递给函数时,数组会衰减到第一个元素的地址。 scanf("%s")
将附加一个空终止字符,因此不必显式插入一个。
为防止潜在的缓冲区溢出,请指定scanf()
应写入userinput
的最大字符数。 这应该小于userinput
的大小,为终止空字符留出空间:
scanf("%255s", userinput);
正在使用不正确的格式说明符(未定义的行为)来打印userinput
字符:使用%c
而不是%s
。 这个:
printf("%s", userinput[i]);
一定是:
printf("%c", userinput[i]);
更改
scanf("%s", &userinput);
至
scanf("%s", userinput);
在字符串捕获的情况下,不需要&
运算符。 scanf()
自动将空字符( '\0'
)附加到字符串的末尾,因此int j = strlen(userinput);
应该管用。
如果您仍然希望在没有此function的情况下有效地计算长度,那么链接如何有效地计算C中字符串的长度?
改变这个
scanf("%s", &userinput);
同
scanf("%s", userinput);
我们必须使用scanf
地址:
- 如果我们将扫描到一个
int a
那么我们必须使用地址a
=>&a
调用scanf()
- 如果我们将扫描
double a
那么我们必须使用地址a
=>&a
调用scanf()
- 但是如果我们将数据扫描到指针(内存地址)
int *a;
或char数组char a[50];
然后我们必须用指针或数组调用scanf()
而不添加&
从scanf()页面
根据格式字符串,该函数可能需要一系列附加参数,每个参数包含指向已分配存储的指针,其中提取字符的解释以适当的类型存储。 这些参数应至少与格式说明符存储的值的数量一样多。 函数忽略其他参数。 这些参数应该是指针:要将scanf操作的结果存储在常规变量上,其名称前面应该有引用运算符(&)(参见示例)。
正如其他人指出的那样,你对类型感到困惑。 当你对类型感到困惑时使用scanf和printf很危险!
scanf(“%s”,&userinput);
&userinput
的类型是char (*)[256]
,但scanf期望%s
对应于char *
。 由于期望的类型和给定的类型不同并且不需要具有相同的表示,因此行为是未定义的。
我认为这是因为strlen应该获取字符串的第一个char的地址,然后迭代直到达到null char,但scanf实际上并不创建null char。
错误。 当您使用%s
格式说明符时,scanf肯定会分配一个空字符。 也就是说,提供scanf不会遇到错误或EOF。 在这方面,您应该检查scanf中的错误:
if (scanf("%s", userinput) != 1) { /* Insert error handling here */ }
…正如您应该使用C中的所有标准库函数一样。
k
毫无意义。 你的循环已经以与k
相同的频率递增i
。
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]);
。