首页 文章

程序中的分段错误,用于对用户输入的字符串中的数字,小写字母和标点符号进行计数

提问于
浏览
0

编写一个程序,要求用户输入3个字符串 . 程序然后获取每个字符串并计算数字,小写字母和标点符号 . 程序编译但在用户输入第一个字符串后,存在分段错误并且程序崩溃 . 当我运行程序时,这是结果:

输入第一个字符串:1输入第二个字符串:输入第二个字符串:2分段错误

不确定到底发生了什么,但任何帮助都会很棒!谢谢 .

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

int countDigit(char *s);
int countLower(char *s);
int countPunct(char *s);

int main (void)
{
        int digit, lower, punct;
        char *first;
        char *second;
        char *third;
        char *c;

        printf("Enter the first string\n:");
        scanf("%99s", first);
        printf("Enter the second string\n:");
        scanf("%99s", second);
        printf("Enter the second string\n:");
        scanf("%99s", third);

        digit=countDigit(first);
        lower=countLower(first);
        punct=countPunct(first);

        printf("There are %d digits, %d lower case letters and %d punctuation chars in a\n", digit, lower, punct);

        digit=countDigit(second);
        lower=countLower(second);
        punct=countPunct(second);

        printf("There are %d digits, %d lower case letters and %d punctuation chars in b\n", digit, lower, punct);

        digit=countDigit(third);
        lower=countLower(third);
        punct=countPunct(third);

        printf("There are %d digits, %d lower case letters and %d punctuation chars in c\n", digit, lower, punct);

}

int countDigit(char *s)
{
        int count = 0;
        char temp;
        while(*s !=0)
        {
                temp = *s;
                if (isdigit(temp))
                {
                        count++;
                }
                s++;
        }
        return count;
}

int countLower(char *s)
{
        int count = 0;
        char temp;
        while (*s !=0)
        {
                temp = *s;
                if (islower(temp))
                {
                        count++;
                }
                s++;
        }
        return count;
}

int countPunct(char *s)
{
        int count = 0;
        char temp;
        while (*s !=0)
        {
                temp = *s;
                if (ispunct(temp))
                {
                        count++;
                }
                s++;
        }
        return count;
}

2 回答

  • 3

    您需要为字符串分配内存 . 你在那里只有指针,你需要做以下事情:

    char *first  = new char[100];
    char *second = new char[100];
    char *third  = new char[100];
    

    这样,您就可以从堆中分配内存,您可以在其中存储来自用户的输入 . 确保在完成后释放内存:

    delete [] first;
    delete [] second;
    delete [] third;
    

    请注意, newdelete 来自C . 您需要包含相应的标头,或使用C等效项 mallocfree .

    你也可以使用堆栈中的内存,这更容易处理(你不必释放它),但也有更多的恐慌,像这样:

    char first[100];
    char second[100];
    char third[100];
    

    基本上,当您尝试在没有先分配内存的情况下访问内存地址时,您会得到segmentation fault . 它只是一种安全机制,以防止(更多)错误 . 当您需要内存时,请确保使用堆栈中的内存,或者使用C malloc或C new分配内存 .

    并且,作为一个建议,如果你伤害到std::string .

  • 3
    char *first;
    char *second;
    char *third;
    char *c;
    
    printf("Enter the first string\n:");
    scanf("%99s", first);
    printf("Enter the second string\n:");
    scanf("%99s", second);
    printf("Enter the second string\n:");
    scanf("%99s", third);
    

    你从未为字符串分配内存 . 所有指针都指向一些随机存储器地址,因此写入它们是 undefined behavior .

相关问题