计算用户输入字符串中的数字、小写字母和标点符号的程序中的分段错误

Posted

技术标签:

【中文标题】计算用户输入字符串中的数字、小写字母和标点符号的程序中的分段错误【英文标题】:Segmentation fault in program that counts digits, lower case letters, and punctuation in user inputted strings 【发布时间】:2014-03-21 02:26:02 【问题描述】:

编写一个要求用户输入 3 个字符串的程序。然后程序获取每个字符串并计算数字、小写字母和标点符号的数量。程序编译,但用户输入第一个字符串后,出现分段错误,程序崩溃。 当我运行程序时,结果如下:

输入第一个字符串 :1 输入第二个字符串 :输入第二个 string :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;

【问题讨论】:

只是对未来问题的建议。您应该尽量保留您的问题short but self contained。由于您在输入后得到 Segmentation Fault,因此您可以确定问题出在开头,而其他所有内容都可以忽略。此外,您的问题中没有 c++ 元素,因此不应使用该标签,否则您可能会得到 c++ 答案,如果您实际上正在使用 c,则无法使用。 看起来很像this question from yesterday 【参考方案1】:

您需要为字符串分配内存。您所拥有的只有指针,您需要执行以下操作:

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 分配它。

而且,作为一个建议,如果你使用 C++,看看std::string 也没什么坏处。

【讨论】:

或者,通过执行 char first[100], second[100], third[100] 来坚持更简单、更快和更安全的堆栈分配。【参考方案2】:
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);

您从未为字符串分配内存。您所有的指针都指向一些随机内存地址,因此写入它们是未定义的行为

【讨论】:

以上是关于计算用户输入字符串中的数字、小写字母和标点符号的程序中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

根据输入字符串,分别计算大写,小写,数字,标点的个数

正则表达式判断字符串中包含数字,大写字符,小写字母,特殊符号中的几种怎么判断?

js密码正则表达式:要求包含大小写字母、数字和特殊符号,8~16位

js密码正则表达式:要求包含大小写字母、数字和特殊符号,8~16位

正则表达式判断字符串中包含数字、大写字符、小写字母、特殊符号中的几种怎么判断?

c语言 利用ascii表输出十个数字符号 26个大写字母符号 笑脸符号和扑克牌符号