我需要创建一个程序,在其中我可以在一个字符串中显示一个单词的次数,并且因为 strchr 而包括*,如果我把它作为示例我的程序可以工作
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,你有" a"出现3次" aaa" ,但是,例如,我尝试使用
从std输入获取 stackscanf("[%s]", &stack);
我的程序不起作用,我也想创建一个2D版本,所以我需要将二维数组中的字符合并为一个字符串,但是如果我将它们放入一个字符数组中,我的程序也不起作用。请不要建议我解决这个问题的其他方法,因为必须这样做。
答案 0 :(得分:1)
您的scanf
电话有一个问题,如果修复了,您还有另外两个问题。
第一个问题是您将指针(即const char **
)的指针作为scanf
的参数传递。虽然参数应该是指针,stack
已经是指针,所以你不必使用address-of运算符来获取指针。
修复第一个问题时的第二个问题是char stack
是指向常量数据的指针,写入常量数据会导致未定义的行为。第三个问题是stack
是一个指针,但你不能分配(至少不是你向我们展示的程序)它可以指向的内存。
使用非常量数组可以很容易地解决后两个问题:
char stack[32];
scanf("%31s", stack);
我已更改格式,以便scanf
不会读取超过31个字符并放入您的数组中。这是因为C中的所有字符串都需要一个特殊的终结符字符。
答案 1 :(得分:1)
将stack
声明为const char*
时,有两个问题:
您无法声明 const ,因为您将修改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;
}
答案 2 :(得分:0)