如何使用string.h将字符合并到C中的字符串?

时间:2014-04-16 05:59:59

标签: c string

我需要创建一个程序,在其中我可以在一个字符串中显示一个单词的次数,并且因为 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输入获取 stack
scanf("[%s]", &stack);

我的程序不起作用,我也想创建一个2D版本,所以我需要将二维数组中的字符合并为一个字符串,但是如果我将它们放入一个字符数组中,我的程序也不起作用。请不要建议我解决这个问题的其他方法,因为必须这样做。

3 个答案:

答案 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)

从use use中读取字符串,

scanf("%s",stack);

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