如何向用户请求字符,然后打印字符的大小?
How do I request characters from a user, and then print the size of the characters?
我是 C 的新手,非常感谢任何帮助。
我无法使用 <string.h>
或 <ctype.h>
库。
这是我的代码:
int main(void)
{
char character;
printf("Introduce characters: ");
scanf(" %c", &character);
printf("\nSize of character: %d", sizeof(character)/sizeof(char));
return 0;
}
这只会打印 1 作为大小。
我在另一个 post 中读到问题是 char character;
初始化字符只会让我存储 1 个字符。所以,我将它修改为一个数组:
int main(void)
{
char character[10];
printf("Introduce maximum 10 characters: ");
scanf(" %s", character);
printf("\nSize of character: %d", sizeof(character)/sizeof(char));
return 0;
}
现在的问题是,通过执行 character[10]
,它打印出大小为 10。我该如何解决这个问题?
sizeof(character)/sizeof(char)
给出您声明的数组的大小,不是 用户输入的大小。
sizeof(character)
给出整个数组的字节数
sizeof(char)
给出单个字符的字节大小
因此,当您执行 sizeof(character)/sizeof(char)
时,您将获得数组的实际大小(即元素数)。您想要实现的目标可以用 strlen()
完成。不过既然不能用<string.h>
,那可以自己写:
int strlen2(char *s)
{
int size;
for (size = 0; s[size]; size++)
;
return size;
}
然后像这样使用它:
#include <stdio.h>
int main(void)
{
char character[10];
printf("Introduce maximum 10 characters: ");
scanf("%s", character);
printf("\nSize of character: %d", strlen2(character));
}
strlen2()
计算字符串的字符数,遇到第一个 [=21=]
字符(空终止符)时停止计数。
避免使用scanf()
读取输入
您的代码容易出现错误。如果用户输入的字符串长度超过 9 个字符(不要忘记在字符串末尾添加了 [=21=]
),就会出现缓冲区溢出,因为 character
只应该包含 10 个字符。您可能希望限制读入字符串的字符数:
scanf("%9s", character); // Read only the first 9 characters and ignore the rest
此外,scanf()
用于解析 输入,而不是实际读取它。使用 fgets()
代替:
#include <stdio.h>
#include <string.h> // for strcspn()
int main(void)
{
char character[10];
printf("Introduce maximum 10 characters: ");
if(!fgets(character, 10, stdin)) {
fprintf(stderr, "Error reading input.\n");
return 1;
}
character[strcspn(character, "\n")] = '[=13=]'; // fgets() reads also `\n` so make sure to null-terminate the string
printf("\nSize of character: %zu", strlen(character));
}
fgets()
接受三个参数:
- 第一个是要存储用户输入的数组
- 第二个是你数组的大小
- 第三个是你要读取的文件流
它 returns NULL
失败所以你也应该检查一下。
好吧,如果您不能使用任何 headers,也许您可以创建一个自定义 strlen()
函数。
strlen()
几乎计算所有字符,直到找到 '[=14=]'
字符。 '[=14=]'
用于表示字符串的结尾,并自动附加 scanf("%s",...)
。
#include <stdio.h>
size_t ms_length(const char *s)
{
size_t i = 0;
for (; s[i] != '[=10=]'; i++)
;
return i;
}
int main(void)
{
char *str = "hello";
printf("%zu\n", ms_length(str));
return 0;
}
如果你想学究气,你甚至可能想检查 scanf()
的 return 值,以查找输入错误,并对要读取的字符应用限制以避免缓冲区溢出。
if (scanf(" %9s", character) != 1) /* 9 characters + 1 reserved for [=11=] */
{
/* handle error */
return 1;
}
我是 C 的新手,非常感谢任何帮助。
我无法使用 <string.h>
或 <ctype.h>
库。
这是我的代码:
int main(void)
{
char character;
printf("Introduce characters: ");
scanf(" %c", &character);
printf("\nSize of character: %d", sizeof(character)/sizeof(char));
return 0;
}
这只会打印 1 作为大小。
我在另一个 post 中读到问题是 char character;
初始化字符只会让我存储 1 个字符。所以,我将它修改为一个数组:
int main(void)
{
char character[10];
printf("Introduce maximum 10 characters: ");
scanf(" %s", character);
printf("\nSize of character: %d", sizeof(character)/sizeof(char));
return 0;
}
现在的问题是,通过执行 character[10]
,它打印出大小为 10。我该如何解决这个问题?
sizeof(character)/sizeof(char)
给出您声明的数组的大小,不是 用户输入的大小。
sizeof(character)
给出整个数组的字节数sizeof(char)
给出单个字符的字节大小
因此,当您执行 sizeof(character)/sizeof(char)
时,您将获得数组的实际大小(即元素数)。您想要实现的目标可以用 strlen()
完成。不过既然不能用<string.h>
,那可以自己写:
int strlen2(char *s)
{
int size;
for (size = 0; s[size]; size++)
;
return size;
}
然后像这样使用它:
#include <stdio.h>
int main(void)
{
char character[10];
printf("Introduce maximum 10 characters: ");
scanf("%s", character);
printf("\nSize of character: %d", strlen2(character));
}
strlen2()
计算字符串的字符数,遇到第一个 [=21=]
字符(空终止符)时停止计数。
避免使用scanf()
读取输入
您的代码容易出现错误。如果用户输入的字符串长度超过 9 个字符(不要忘记在字符串末尾添加了 [=21=]
),就会出现缓冲区溢出,因为 character
只应该包含 10 个字符。您可能希望限制读入字符串的字符数:
scanf("%9s", character); // Read only the first 9 characters and ignore the rest
此外,scanf()
用于解析 输入,而不是实际读取它。使用 fgets()
代替:
#include <stdio.h>
#include <string.h> // for strcspn()
int main(void)
{
char character[10];
printf("Introduce maximum 10 characters: ");
if(!fgets(character, 10, stdin)) {
fprintf(stderr, "Error reading input.\n");
return 1;
}
character[strcspn(character, "\n")] = '[=13=]'; // fgets() reads also `\n` so make sure to null-terminate the string
printf("\nSize of character: %zu", strlen(character));
}
fgets()
接受三个参数:
- 第一个是要存储用户输入的数组
- 第二个是你数组的大小
- 第三个是你要读取的文件流
它 returns NULL
失败所以你也应该检查一下。
好吧,如果您不能使用任何 headers,也许您可以创建一个自定义 strlen()
函数。
strlen()
几乎计算所有字符,直到找到 '[=14=]'
字符。 '[=14=]'
用于表示字符串的结尾,并自动附加 scanf("%s",...)
。
#include <stdio.h>
size_t ms_length(const char *s)
{
size_t i = 0;
for (; s[i] != '[=10=]'; i++)
;
return i;
}
int main(void)
{
char *str = "hello";
printf("%zu\n", ms_length(str));
return 0;
}
如果你想学究气,你甚至可能想检查 scanf()
的 return 值,以查找输入错误,并对要读取的字符应用限制以避免缓冲区溢出。
if (scanf(" %9s", character) != 1) /* 9 characters + 1 reserved for [=11=] */
{
/* handle error */
return 1;
}