编写一个要求用户输入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;
}
答案 0 :(得分: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);
您从未为字符串分配内存。所有指针都指向一些随机内存地址,因此写入未定义行为。
答案 1 :(得分:3)
您需要为字符串分配内存。你所拥有的只有指针,你需要做以下事情:
char *first = new char[100];
char *second = new char[100];
char *third = new char[100];
这样,您就可以从堆中分配内存,您可以在其中存储来自用户的输入。确保在完成记忆后释放内存:
delete [] first;
delete [] second;
delete [] third;
请注意,new
和delete
来自C ++。您需要包含相应的标头,或使用C等效malloc
和free
。
您还可以使用堆栈中的内存,这样更容易处理(您不必释放它)但也更恐慌,如下所示:
char first[100];
char second[100];
char third[100];
基本上,当您尝试在没有先分配内存的情况下访问内存地址时,会得到segmentation fault。它只是一种安全机制,以防止(更多)错误。当您需要内存时,请确保使用堆栈中的内存,或者使用C malloc
或C ++ new
分配内存。
而且,作为一个建议,如果您使用的是C ++,那么查看std::string
并不会有什么坏处。