将字符数组中的指针分配给字符串C中的每个单词

将字符数组中的指针分配给字符串C中的每个单词,c,arrays,string,pointers,C,Arrays,String,Pointers,我有一个最多200个字符的字符数组。我想为数组中的每个单词分配一个点数组。我把这张照片作为应该发生的事情的一个例子。 我尝试在字符串上循环寻找空格,为每个事件指定一个新指针。但是每次它都会打印剩余的字符串,然后崩溃 #include <stdio.h> #include <stdlib.h> int main() { char str[200]; char *arr[200]; fgets(str, 200, stdin); arr[1

我有一个最多200个字符的字符数组。我想为数组中的每个单词分配一个点数组。我把这张照片作为应该发生的事情的一个例子。

我尝试在字符串上循环寻找空格,为每个事件指定一个新指针。但是每次它都会打印剩余的字符串,然后崩溃

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[200];
    char *arr[200];
    fgets(str, 200, stdin);
    arr[1] = &str[5];
    printf("%s", arr[1]);
    int i = 0;
    int next = 0;
    char ch = ' ';
    for (; i < 200; i++) {
        ch = str[i];
        if (ch == ' '){
            arr[next] = &str[i];
            next++;
        }
    }
    i = 0;
    for (; i < 200; i++) {
        printf("%s", arr[i]);
    }
    return 0;
}

如果内容中的空白少于200,输出循环将从arr[i]获取指向随机地址的指针,并将其提供给printf。。。这可能会导致崩溃。

要修复的示例

#include <stdio.h>

int main() {
    char str[200];
    char *arr[sizeof(str)/2];//Enough if half
    fgets(str, sizeof(str), stdin);
    int i, j;
    char ch = ' ';
    for (j = i = 0; str[i] && str[i] != '\n'; i++) {//i < 200 is over run.
        if(ch == ' ' && str[i] != ' ')
            arr[j++] = &str[i];
        ch = str[i];
    }
    for (i = 0; i < j; i++) {//i < 200 is over run.
        printf("%s", arr[i]);
    }
    return 0;
}
您有两个选择:

1如果字符串可修改,则可以将每个单词后面的第一个空白字符更改为“\0”。这将允许您使用存储的指针打印,但原始字符串将无法再正确打印


2将字符串和指针的长度存储在一个结构中,并具有一个自定义函数,可以为您打印它们。

此外,在这种情况下,strtok看起来可能很有用。我们无法帮助处理看不见的代码。我有,我想。。到目前为止发布代码怎么样?如果用0字符终止符替换发现的空白字符,将会发生有趣的事情。如果你使用而不是重新发明这个已经相当循环的轮子,会发生更好的事情。谢谢你,这就是我认为我的代码会工作的方式,但我试图实现的是让它逐字打印,而不是在每个空格后打印字符串的其余部分。@Methodman需要在单词后更改为“\0”,以不打印其余字符。strtok在已经指出的过程中很有用。@TheMethodMan我用strtok添加示例。strtok似乎做了1
#include <stdio.h>
#include <string.h>

int main() {
    char str[200];
    char *arr[sizeof(str)/2];
    fgets(str, sizeof(str), stdin);
    int i, j=0;
    char *word = strtok(str, " \t\n");
    while(word){
        arr[j++] = word;
        word = strtok(NULL, " \t\n");
    }
    for (i = 0; i < j; i++) {
        printf("%s\n", arr[i]);
    }
    return 0;
}