我的函数应该打印出字符串中不止一次的字母。我不知道为什么我得到一个空输出,或者我的程序'停止工作'。
#include <string.h>
#include <stdio.h>
void funkcja3 (char []);
int main()
{
funkcja3("napnapnaaw");
return 0;
}
void funkcja3 (char napis[])
{
int i=0,j;
for(;i<strlen(napis);i++)
{
if((napis[i]>='a')&&(napis[i]<='z'))
{
int n=0;
for(j=i+1;j<strlen(napis);j++)
{
if(napis[i]==napis[j])
{
n++;
napis[j]=' ';
}
}
if(n>0)
{
printf("%c ", napis[i]);
}
}
}
}
答案 0 :(得分:2)
您需要传递可修改的字符串:
int main()
{
char str[] = "napnapnaaw";
funkcja3(str);
return 0;
}
答案 1 :(得分:2)
这不是您问题的直接答案,但如果您只想打印出在给定字符串中出现多次的所有非大写字母,那么您可以使用直方图(符号计数)代替:
void funkcja3(char napis[])
{
int histogram['z'-'a'+1] = {0};
for (int i=0; napis[i]!=0; i++)
{
if ('a' <= napis[i] && napis[i] <= 'z')
histogram[napis[i]-'a']++;
}
for (int i=0; i<'z'-'a'+1; i++)
{
if (histogram[i] > 1)
printf("%c ",'a'+i);
}
}
BTW,histogram =数据中每个符号的出现次数。
答案 2 :(得分:0)
当我在我的机器上运行程序(Ubuntu,gcc 4.6)时,我遇到了分段错误和核心转储。将程序和核心转储提供给gdb并进行回溯给出
$ gdb a.out core
Core was generated by `/tmp/a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x00000000004005a2 in funkcja3 (napis=0x40072c "napnapnaaw") at a.c:25
25 napis[j]=' ';
(gdb) bt
bt
#0 0x00000000004005a2 in funkcja3 (napis=0x40072c "napnapnaaw") at a.c:25
#1 0x0000000000400520 in main () at a.c:8
此提示让我删除第25行并再次运行程序
$ a.out
n a p n a a
显示所有字符,后面在字符串中重复。
答案 3 :(得分:0)
当您调用funkcja3时,您将使用字符串文字调用它。此字符串文字位于不可修改的内存位置,因此对napid[j] = ' '
的调用应该失败(当我将示例复制到visual studio 2013时会这样做)。您需要做的是A:使用std::string
(或其他字符串实现)或B:在函数中创建字符串的副本,检查它,然后在完成后删除副本。无论哪种方式,您可能不应该修改进入该函数的原始字符串。修改传递给函数的对象通常是不好的做法,除非函数绝对必须这样做。
还有一些其他方法可以完成此任务,例如26个短裤数组来保存每个角色的计数。进行这些计数,然后打印出任何超过1的字符。