Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么它显示随机数?C程序读取字符串字母_C_String - Fatal编程技术网

为什么它显示随机数?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++}并打印出来:DIs
string[strlen(string)-1]='\0';
用于切断换行符?指的是“如何制作非字母部分?”从下面的@Mohammed开始:通过使用
isalpha
。如果返回0,则字符为非字母,否则为字母。或者为了更容易推导数组索引,可以使用
isupper
islower