2014-04-16 37 views
0

我需要建立一个程序,我可以有多少次一个词出现在一个字符串,我包括*因为,和strchr和我的程序的工作,如果我把这个例如如何合并字符到C中使用string.h字符串?

int main(void) { 
    const char *needle, *stack; 

    needle = "a"; stack = "aaa"; 
    printf("[%s] exists %d times in [%s]\n", needle, count(needle, stack), stack); 
return 0; 
} 

和输出是3,你有“AAA”,“一”出现3次,但例如如果我尝试从STD输入获得

scanf("[%s]", &stack); 

我的程序不能正常工作,我也想创建这个2D版本,所以我需要合并字符从二维数组转换为字符串,但如果我把它们放入一个字符数组中,我的程序也无法正常工作。请不要向我建议其他解决方案来解决此问题,因为它必须与此类似。

回答

0

从使用利用读取字符串,

scanf("%s",stack); 

这是一个使用的scanf读取℃的字符串()的格式。你可以阅读这个相关的question
您还需要分配内存给变量stack

+0

这不会在这里工作,直到指针分配的内存。 –

+0

@MudassirHussain好的谢谢你 – LearningC

1

你的scanf呼叫有一个问题,当这个问题得到解决时,你有两个问题。

第一个问题是您将指针传递给指针(即const char **)作为参数scanf。虽然参数应该是指针,stack已经是一个指针,所以你不必使用address-of操作符来获取指针。

修复第一个问题时的第二个问题是char stack是一个指向常量数据的指针,并且写入常量数据会导致未定义的行为。第三个问题是stack是一个指针,但是您不会分配(至少不会在您向我们显示的程序中)它可以指向的内存。

两个问题后可以很容易地通过使用非恒定的阵列,而不是解决:

char stack[32]; 
scanf("%31s", stack); 

我已经改变了格式,以便scanf将无法​​读取超过31个字符,并把你的数组。这是31,因为C中的所有字符串都需要特殊的终止符。

1

在声明stackconst char*有2个问题:

  • 你不能把它声明常量,因为你将修改scanf函数的值

  • 你不分配空间为stack允许存储的数据读取

你没有问题needle,因为这样做needle = "a";时,针指针会指向a这已经是静态地.data段划分,是const char*

为了解决这个问题,你有2个解决方案:

int main(void) { 
    const char *needle; 
    char stack[200]; 
    needle = "a"; 
    scanf("%199s", &stack); 
    printf("[%s] exists %d times in [%s]\n", needle, count(needle, stack), stack); 
    return 0; 
} 

或通过在堆中动态分配内存:

int main(void) { 
    const char *needle; 
    char *stack = new char[200]; 
    needle = "a"; 
    scanf("%199s", stack); 
    printf("[%s] exists %d times in [%s]\n", needle, count(needle, stack), stack); 

    delete[] stack; 
    return 0; 
}