为什么它显示随机数?C程序读取字符串字母
因此,我必须创建一个程序来读取用户输入,并显示每个字母在该字符串中出现的次数,以及有多少非字母,但我的字母表代码显示的是随机数为什么它显示随机数?C程序读取字符串字母,c,string,C,String,因此,我必须创建一个程序来读取用户输入,并显示每个字母在该字符串中出现的次数,以及有多少非字母,但我的字母表代码显示的是随机数 #include <stdio.h> #include <string.h> #define SIZE 100 void readInput (char string[]); void Calc(char string[], int letters[]); void readInput (char string[]) { print
#include <stdio.h>
#include <string.h>
#define SIZE 100
void readInput (char string[]);
void Calc(char string[], int letters[]);
void
readInput (char string[])
{
printf ("Enter a String:\n");
fgets (string, SIZE, stdin);
string[strlen (string) - 1] = '\0';
}
void
Calc(char string[], int letters[])
{
int c = 0, x;
while (string[c] != '\0')
{
if (string[c] >= 'a' && string[c] <= 'z')
{
x = string[c] - 'a';
letters[x]++;
}
c++;
}
for (c = 0; c < 26; c++)
printf ("%c occurs %d times in the entered string.\n", c + 'a', letters[c]);
}
int
main ()
{
char string[SIZE];
int letters[26];
readInput (string);
Calc(string, letters);
return 0;
}
#包括
#包括
#定义大小100
void readInput(字符字符串[]);
void Calc(字符字符串[],整数字母[]);
无效的
readInput(字符字符串[])
{
printf(“输入字符串:\n”);
fgets(字符串、大小、标准输入);
字符串[strlen(string)-1]='\0';
}
无效的
计算(字符字符串[],整数字母[])
{
int c=0,x;
while(字符串[c]!='\0')
{
如果(string[c]>='a'&&string[c]未初始化字母的内容。从形式上讲,程序的行为是不确定的
通过写入int-letters[26]={0};
将所有元素设置为零,这就是您在本例中想要的。letters[]
未初始化。
解决方案int字母[26]={0}
您正在读取一个不确定的未初始化值。结果与您预期的不一致
在这里,您想用0
初始化元素,表示您还没有看到任何字符。(自动存储持续时间)
覆盖'\n'
的更好方法是
string[strcspn(string, "\n")] = 0;
你应该用所有0值初始化字母不是未定义的。只是不确定。你正在读取一个未初始化的值,这是未定义的行为。
。这太夸张了。伙计们……他们自己的值是不确定的。从技术上讲,访问这些值是:未定义的behaviour@MrPaulch不,只有十一点如果正在读取的对象可以声明为register
@FelixPalmen,这是一个很好的讨论,它可以归结为几乎所有具有自动存储的非聚合类型都可以声明为register…我唯一的问题是最后的注释之一“写入单个成员就足以拥有一个已初始化的对象”。并不是写入一个执行此操作的成员,而是初始化一个成员,使所有剩余成员被视为使用静态存储持续时间声明的成员(从而初始化为零)当然,这也是一个吹毛求疵的问题,但行为并不是不确定的。结果是不确定的;@Mohammed你写道:但现在我们如何将非字母部分划分出来?你的意思是什么?@MichaelWalz因此输出显示:a出现3次;非字母出现4次;@Mohammed如果不在“a”和“z”之间,则增加“非字母”" conter@MichaelWalz再次,我试图做另一个循环,哈哈,只是添加了其他{special++}并打印出来:DIsstring[strlen(string)-1]='\0';
用于切断换行符?指的是“如何制作非字母部分?”从下面的@Mohammed开始:通过使用isalpha
。如果返回0,则字符为非字母,否则为字母。或者为了更容易推导数组索引,可以使用isupper
和islower
。