我有两个部分给出了一个问题。 A部分是通过字符串操作来反转字符串中的单词,我使用了strcpy和strcat。但是,对于B部分,我必须使用指针反转单词。现在我有下面显示的代码。我是在正确的轨道上吗?
我的函数背后的想法是我有原始字符串string1
并且我有一个指针指向一个起始字符,然后遍历字符串,直到我打到一个空格,给我这个单词的大小。然后我把那个词放在我的新字符串的末尾。
代码:
partb(char * string1, int s)
{
int i=0, j=0, k=0, count=0;
char temp[100]={0}, *sp=string1;
for(i=0; i<=s; i++)
{
if(isalnum(string1[i]))
{
k=i;
break;
}
break;
}
for(i=0; i<=s; i++)
{
if(isalnum(string1[i]))
{
count++;
}
else if(string1[i] == ' ')
{
for(j=0; j<=count; j++)
{
}
}
}
}
答案 0 :(得分:0)
一些观察结果:
你怎么知道temp
足够大以存储反转的字符串?您应该分配一个与输入字符串大小相同的char *
。
当您知道string1[i] == ' '
为假时,为什么要测试isalnum(string1[i])
?您已经处于单词中断,因此无需进行测试。
您忘记在循环内将count
初始化为0。每次发表新词时,您都必须重置count
。
修正错误后,您可以使用您提出的方法实现该功能,但我想提出另一种方法。您可以使用一对索引count
和a
,而不是使用b
,而是以相反的方向遍历单词。
这个程序演示了我的方法:
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
int isWordCharacter(char c) {
return isalnum(c);
}
char * reverseWords(char *s) {
int pos = 0, seek, a, b, len;
for (len = 0; s[len] != 0; ++len) { // Find the string length ourselves to
} // avoid using anything from string.h.
char *result = malloc(len * sizeof(char));
while (1) {
while (!isWordCharacter(s[pos])) { // Look for the start of a word.
result[pos] = s[pos];
if (pos == len) { // Are we at the end of the string?
return result;
}
++pos;
}
for (seek = pos + 1; isWordCharacter(s[seek]); ++seek) {
} // Look for the end of the word.
for (a = pos, b = seek - 1; a < seek; ++a, --b) {
result[b] = s[a]; // Scan the word in both directions.
}
pos = seek; // Jump to the end of the word.
}
}
int main() {
char *s = "Hello, world. Today is September 20, 2015.";
printf("%s\n%s\n", s, reverseWords(s));
}