c - 使用 Malloc 输入字符串后程序崩溃

标签 c string pointers

<分区>

输入长字符串后程序崩溃。我认为该程序无法处理用户输入的大量字符串。你能帮我看看我的代码有什么问题吗?

一个简单的 C 程序,使用指针计算字符串中的元音和辅音。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char * sEnteredString= NULL;
    int i;
    int sizeString;
    int vowel=0;
    int consonants=0;

    printf("A program that counts the number of vowels and consonants in a string\n");
    printf("Enter a string:\t");
    sEnteredString = (char*)malloc(sizeof(sEnteredString));
    scanf(" %s",sEnteredString);

    if (sEnteredString==NULL)
    {
        printf("OUT OF MEMORY\n");
    }
    else
    {
        sizeString=strlen(sEnteredString);

        for (i=0; i<sizeString;i++)
        {
            if((sEnteredString[i] == 'A') || \
               (sEnteredString[i] == 'a') || \
               (sEnteredString[i] == 'E') || \
               (sEnteredString[i] == 'e') || \
               (sEnteredString[i] == 'I') || \
               (sEnteredString[i] == 'i') || \
               (sEnteredString[i] == 'O') || \
               (sEnteredString[i] == 'o') || \
               (sEnteredString[i] == 'U') || \
               (sEnteredString[i] == 'u'))
            {
                vowel ++;
            }
            else
            {
                consonants ++;
            }
        }
            printf("Entered vowel: %d \nEntered constants: %d\n", vowel, consonants);
    }

    free(sEnteredString);
    return 0;
}

最佳答案

你为什么(错误地)为此分配动态内存:

sEnteredString = (char*)malloc(sizeof(sEnteredString));

sizeof(sEnteredString) 是字符指针的大小(通常为 4 或 8)?输入“嘿!华夫饼!”之类的字符串时太短了。

什么时候可以做:

char sEnteredString[100];

然后

scanf("%99s",sEnteredString);

因此您可以自动分配您的字符串,并且在有人输入太大字符串的情况下是安全的。

重要:不要在最后free(sEnteredString)

旁白:使用 toupperswitch/case 语句来避免所有这些 if。并记住计算辅音,而不是不是元音的字符(如空格、标点符号……)

关于c - 使用 Malloc 输入字符串后程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47995875/

相关文章:

c - 在c中制作一长串加密子字符串

C:从模式匹配中提取字符串和字符串终止的替代方法?

c - 指针数组初始化

java - 如何将 CharSequence 转换为字符串?

c - 在 C 中定义一个全局结构指针?

c++ - 非拥有智能指针的实用代码友好名称

c - 为什么这个分配在堆栈而不是堆上?

c - 如何检查字符串中是否至少存在三位数字?

无法使用指针为结构创建动态数组

java - 我做了一个 for 循环来交换字符串中的两个 indiv char 变量