我打算修改特定字符串的每个其他字母。但就本计划而言,这一切都不会发生。到目前为止,我已经从用户那里抓取了一个字符串并将其存储在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'
的方法。
如果存储的字符序列存储在数组中,我将如何访问存储字符序列的长度?
答案 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希望%s
与char *
对应。由于期望的类型和给定的类型不同,并且不需要具有相同的表示,因此行为未定义。
我认为这是因为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]);
。