我的程序在某些情况下似乎无法分隔单词
My program can't seem to separate words at certain cases
我最关心的是查找和分离功能。当我在另一个程序中重用它们时,我发现它们并不总是有效,有时会显示分段错误。我尝试了所有我能做的事情,但没有任何效果。
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int find(char *argument)
{
int count = 0;
int i = 0;
int state = 0;
while (argument[i] != '[=10=]')
{
if (argument[i] == ' ' || argument[i + 1] == '[=10=]')
{
state = 0;
}
else if (state == 0)
{
state = 1;
count++;
}
i++;
}
return count;
}
char **sepration(int args, char str[])
{
int i = 0;
char **argv = (char **)malloc(args);
int k = 0;
int len = strlen(str);
while (i < len)
{
if (str[i] != ' ')
{
char *st = &str[i];
argv[k] = st;
k++;
while (str[i] != ' ' && str[i] != '[=10=]' && i < len)
{
i++;
}
str[i] = '[=10=]';
}
i++;
}
return argv;
}
int main()
{
char argument[100];
scanf("%[^\n]s", &argument);
//finds the no of words in the given argument
int args = find(argument);
char **argv = (char **)malloc(args + 1);
//stores the word separately in **char pointer array
argv = sepration(args, argument);
//adds the arguments whichs are numbers
add(args, argv);
}
您的解决方案的问题是您没有正确分配内存。
你的双指针 argv
应该作为一个字符串数组。因此 argv
应该为其分配足够的内存。那么下一个问题是如何为其分配足够的内存。由于 argv
应包含 argc
个字符串,因此适当的内存分配将是
char **argv = malloc(args * sizeof(char *));
或
char *argv[argc];
修改后的代码看起来像
char **sepration(int args, char str[])
{
int i = 0;
char **argv = malloc(args * sizeof(char *));
int k = 0;
int len = strlen(str);
while (i < len)
{
if (str[i] != ' ')
{
char *st = &str[i];
argv[k] = st;
k++;
while (str[i] != ' ' && str[i] != '[=10=]' && i < len)
{
i++;
}
str[i] = '[=10=]';
}
i++;
}
return argv;
}
int main()
{
char argument[100];
scanf("%[^\n]", argument);
//finds the no of words in the given argument
int args = find(argument);
char **argv = malloc(args * sizeof(char *));
//stores the word separately in **char pointer array
argv = sepration(args, argument);
for(int i = 0; i < args; i++)
printf("%s\n", argv[i]);
}
您也可以使用 char *argv[argc];
而不是 char **argv = malloc(args * sizeof(char *));
。这也会给出相同的结果。
我最关心的是查找和分离功能。当我在另一个程序中重用它们时,我发现它们并不总是有效,有时会显示分段错误。我尝试了所有我能做的事情,但没有任何效果。
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int find(char *argument)
{
int count = 0;
int i = 0;
int state = 0;
while (argument[i] != '[=10=]')
{
if (argument[i] == ' ' || argument[i + 1] == '[=10=]')
{
state = 0;
}
else if (state == 0)
{
state = 1;
count++;
}
i++;
}
return count;
}
char **sepration(int args, char str[])
{
int i = 0;
char **argv = (char **)malloc(args);
int k = 0;
int len = strlen(str);
while (i < len)
{
if (str[i] != ' ')
{
char *st = &str[i];
argv[k] = st;
k++;
while (str[i] != ' ' && str[i] != '[=10=]' && i < len)
{
i++;
}
str[i] = '[=10=]';
}
i++;
}
return argv;
}
int main()
{
char argument[100];
scanf("%[^\n]s", &argument);
//finds the no of words in the given argument
int args = find(argument);
char **argv = (char **)malloc(args + 1);
//stores the word separately in **char pointer array
argv = sepration(args, argument);
//adds the arguments whichs are numbers
add(args, argv);
}
您的解决方案的问题是您没有正确分配内存。
你的双指针 argv
应该作为一个字符串数组。因此 argv
应该为其分配足够的内存。那么下一个问题是如何为其分配足够的内存。由于 argv
应包含 argc
个字符串,因此适当的内存分配将是 char **argv = malloc(args * sizeof(char *));
或
char *argv[argc];
修改后的代码看起来像
char **sepration(int args, char str[])
{
int i = 0;
char **argv = malloc(args * sizeof(char *));
int k = 0;
int len = strlen(str);
while (i < len)
{
if (str[i] != ' ')
{
char *st = &str[i];
argv[k] = st;
k++;
while (str[i] != ' ' && str[i] != '[=10=]' && i < len)
{
i++;
}
str[i] = '[=10=]';
}
i++;
}
return argv;
}
int main()
{
char argument[100];
scanf("%[^\n]", argument);
//finds the no of words in the given argument
int args = find(argument);
char **argv = malloc(args * sizeof(char *));
//stores the word separately in **char pointer array
argv = sepration(args, argument);
for(int i = 0; i < args; i++)
printf("%s\n", argv[i]);
}
您也可以使用 char *argv[argc];
而不是 char **argv = malloc(args * sizeof(char *));
。这也会给出相同的结果。