c打印出字母,这些字母重复出现在字符串中

c打印出字母,这些字母重复出现在字符串中,c,C,我的函数应该打印出字符串中不止一次的字母。我不知道为什么我得到一个空输出,或者我的程序“停止工作” #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<strl

我的函数应该打印出字符串中不止一次的字母。我不知道为什么我得到一个空输出,或者我的程序“停止工作”

#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]);
            }
        }
    }
}
#包括
#包括
void funkcja3(char[]);
int main()
{
funkcja3(“Napnaaw”);
返回0;
}
void funkcja3(字符napis[]
{
int i=0,j;

对于(;i='a')&&(napis[i]您需要传递一个可修改的字符串:

int main()
{
    char str[] = "napnapnaaw";
    funkcja3(str);
    return 0;
}

当我在我的机器上运行你的程序(Ubuntu,GCC4.6)时,我得到一个分段错误和一个核心转储

$ 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 

它显示了所有字符,这些字符后来在字符串中的某个位置重复。

当您调用funkcja3时,您使用的是字符串文本。该字符串文本位于不可修改的内存位置,因此对
napid[j]=''
的调用应该失败(当我将您的示例复制到visual studio 2013中时也是如此)。您需要做的是:使用
std::string
(或其他字符串实现)或者B:在函数中复制一个字符串,检查它,然后在完成后删除该副本。无论是哪种方式,您都不应该修改传入函数的原始字符串。修改传入函数的对象通常是不好的做法,除非函数必须这样做


还有其他一些方法可以完成此任务,例如26个短字符组成的数组来保存每个字符的计数。进行这些计数,然后打印出任何超过1的字符。

这不是对您的问题的直接回答,但如果您只想打印出所有在中多次出现的非大写字母如果是给定的字符串,则可以使用直方图(符号计数):

void funkcja3(char napis[]
{
整数直方图['z'-'a'+1]={0};
for(int i=0;napis[i]!=0;i++)
{

如果('a'
napid[j]=''
试图修改一个文本字符串,这是不允许的。这不是一个“正确行为”问题,但您可能应该避免在循环控件中调用
strlen(napis)
,尤其是内部循环。由于两个
strlen()
calls@pw94首先,不要使用Dev-C++。其次,阅读一本好的介绍性书籍,学习C的基础知识。@JonathanLeffler谁会在乎它,直到它不起作用?@KarolyHorvath好吧,你会向那些甚至不知道字符串文本是只读的人推荐什么样的材料?(今天这是第三个重复的问题。)谢谢你的帮助。我真的很感激。刚刚意识到这个问题被特别标记为C,这使得std::string不是一个选项。函数应该真正复制输入字符串,这样就不会修改它的输入参数。
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);
    }
}