我做了这个程序来反转给定字符串中单词的顺序。 (而且有效)
即输出:sentence first the is This
但是,在将另一个句子添加到数组时,我陷入了困境。
例如,我需要一个数组{"This is the first sentence", "And this is the second"}
作为输出生成:sentence first the is This , second the is this And
int main() {
char str[] = {"This is the first sentence"};
int length = strlen(str);
// Traverse string from end
int i;
for (i = length - 1; i >= 0; i--) {
if (str[i] == ' ') {
// putting the NULL character at the position of space characters for
next iteration.
str[i] = '\0';
// Start from next character
printf("%s ", &(str[i]) + 1);
}
}
// printing the last word
printf("%s", str);
return 0;
}
我是C的新手,所以即使解决方案很简单,我也被卡住了并不奇怪。任何帮助,将不胜感激!谢谢!
答案 0 :(得分:1)
由于您已经具有以相反顺序打印一个字符串的单词的代码,因此建议您将 function 设为一个以单个字符串作为参数的字符串,即:
void print_words_reverse(char * const str) {
// your current code here
}
然后您可以为每个字符串分别调用它:
char strings[][30] = {
"This is the first sentence",
"And this is the second"
};
for (int i = 0; i < sizeof(strings) / sizeof(*strings); ++i) {
print_words_reverse(strings[i]);
}
请注意,由于您正在修改字符串(通过使用NUL字节替换空格),因此该参数需要可修改,这意味着您(在标准C语言中)不允许使用指向字符串文字的指针来调用它,表示您不能简单地使用const char *strings[] = { "first", "second" }
。通过使代码不修改参数字符串,可以摆脱为每个字符串保留的难看的常量长度(此处为30
)。或者,您可以为每个句子使用一个单独的char数组,然后使用指向那些(可修改的)字符串的指针。
答案 1 :(得分:1)
首先,您可以尝试使用二维数组或使用指针数组。
第二,在您的方法中,您丢失了字符串的初始值,我不知道它的重要性。
这是我快速使用指针的方法。
#include <stdio.h>
#include <string.h>
static void print_word(const char *str)
{
for (int i = 0; str[i] && str[i] != ' '; i++)
printf("%c", str[i]);
putchar(' ');
}
int main(void)
{
int len;
const char *str[] = {"This is the first sentence",
"And this is second", NULL};
for (int i = 0; str[i]; i++) {
for (len = strlen(str[i]); len >= 0; len--) {
if (len == 0)
print_word(&str[i][len]);
else if (str[i][len] == ' ')
print_word(&str[i][len + 1]);
}
putchar('\n');
}
printf("Initial value of array of strings [%s | %s] \n", str[0], str[1]);
return 0;
}
输出为:
首先句子是
这是第二个
字符串数组的初始值[这是第一句话|这是第二个]
答案 2 :(得分:0)
我建议您使用memcpy
,但不要过多修改您的代码,这似乎可以解决问题
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_STRING_LENGTH 100
int main()
{
char *str[] = {"This is the first", "And this is the second sentence"};
const size_t NUM_STRING = sizeof(str)/sizeof(char*);
/*%z used to print size_t variables*/
printf("%zd strings found\n", NUM_STRING);
int length[2];
int i;
for (i=0; i<NUM_STRING; i++)
{
length[i] = strlen(str[i]);
}
printf("length initialized %d %d\n", length[0], length[1]);
// Traverse string from end
int j = 0;
char temp[MAX_STRING_LENGTH];
printf("\n\n");
for (j=0; j<NUM_STRING; j++)
{
/*Make sure the string respect the MAX_STRING_LENGTH limit*/
if (strlen(str[j])>MAX_STRING_LENGTH)
{
printf("ERROR: string %d exceding max string length %d defined in constant "
"MAX_STRING_LENGTH. Exiting from program.\n", j, MAX_STRING_LENGTH);
exit(1);
}
//reset temporary string
memset(temp, '\0', sizeof(temp));
//printf("temp variable reinitialized\n");
for (i = length[j] - 1; i >= 0; i--)
{
temp[i] = str[j][i];
if (str[j][i] == ' ')
{
// putting the NULL character at the position of space characters for next iteration.
temp[i] = '\0';
// Start from next character
printf("%s ", &(temp[i]) + 1);
}
}
// printing the last word
printf("%s ", temp);
}
printf("\n");
return 0;
}