使用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]);