将字符数组中的指针分配给字符串C中的每个单词
我有一个最多200个字符的字符数组。我想为数组中的每个单词分配一个点数组。我把这张照片作为应该发生的事情的一个例子。 我尝试在字符串上循环寻找空格,为每个事件指定一个新指针。但是每次它都会打印剩余的字符串,然后崩溃将字符数组中的指针分配给字符串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
#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;
}