c打印出以字符串重复出现的字母

时间:2014-01-27 20:14:32

标签: 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<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]);
            }
        }
    }
}

4 个答案:

答案 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的字符。