1

我打算修改一个特定字符串的每个其他字母。但就本计划而言,这一切都没有发生。到目前为止,我已经从用户那里获取了一个字符串并将其存储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

4 回答 4

12

这:

scanf("%s", &userinput);

应该:

scanf("%s", userinput);

操作员的地址&不是必需的,并且不正确。数组在传递给函数时衰减到其第一个元素的地址。scanf("%s")将附加一个空终止字符,因此无需显式插入一个。

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

scanf("%255s", userinput);

不正确的格式说明符(这是未定义的行为)被用于打印: use charnot的行为者。这:userinput%c%s

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

一定是:

printf("%c", userinput[i]);
于 2013-04-04T14:01:21.767 回答
1

改变这个

scanf("%s", &userinput);

scanf("%s", userinput);

我们必须使用地址scanf

  • 如果我们要扫描到 anint a那么我们必须使用=>scanf()的地址调用a&a
  • 如果我们要扫描到 adouble a那么我们必须用=>scanf()的地址调用a&a
  • 但是如果我们要用指针(内存地址)int *a;或字符数组扫描数据,char a[50];那么我们必须scanf()用指针或数组调用而不添加&

scanf()页面

根据格式字符串,该函数可能需要一系列附加参数,每个参数都包含一个指向已分配存储空间的指针,其中提取的字符的解释以适当的类型存储。这些参数的数量至少应与格式说明符存储的值的数量一样多。该函数会忽略其他参数。这些参数应该是指针:要将 scanf 操作的结果存储在常规变量上,它的名称应该以引用运算符 (&) 开头(参见示例)。

于 2013-04-04T14:02:55.083 回答
1

改变

scanf("%s", &userinput);

scanf("%s", userinput);

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

如果你仍然想在没有这个函数的情况下有效地计算长度,这里是链接如何有效地计算 C 中字符串的长度?

于 2013-04-04T14:11:31.967 回答
1

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

scanf("%s", &userinput);

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

我认为这是因为 strlen 应该获取字符串的第一个字符的地址,然后迭代直到达到空字符,但 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]);

于 2013-04-04T14:23:03.627 回答