出于某种原因,我无法让它发挥作用!谁能告诉我哪里出错了?这应该是反转给定字符串中的单词(即从“这是一个测试”到“测试一个就是这个”)
#include <stdio.h>
#include <stdlib.h>
char *reverse(char const *input)
{
char *ret = (char *)malloc(sizeof(char) * strlen(input));
int length = 0;
int numWords = 1;
int i;
for(i=0; input[i]!=NULL; i++)
{
length++;
if(input[i]==' ')
numWords++;
}
char words[numWords];
int currentWord = numWords;
for(i=0; input[i]!=NULL; i++)
{
if (input[i]==' '){
currentWord--;
}else{
words[currentWord] = words[currentWord] + input[i];
}
}
for(i=0; i < numWords; i++)
{
ret = ret + words[i];
}
return ret;
}
int main(int argc, char **argv)
{
int nTestcase = 0;
int i = 0;
char inputstr[100];
char *reversedStr = NULL;
scanf("%d\n", &nTestcase);
for (i = 0; i < nTestcase; i++)
{
fgets(inputstr, 100, stdin);
reversedStr = reverse(inputstr);
printf("%s\n", reversedStr);
free(reversedStr);
memset(inputstr, 0, 100);
}
return 0;
}
答案 0 :(得分:1)
words[currentWord] = words[currentWord] + input[i];
您无法像期待字符串连接那样相互添加字符。我想你期望words
是一个单词数组(即字符串),但它的类型不是那个,words
只是一个字符数组。
就像@Tom所说,你在最后一个for循环中再次这样做:
ret = ret + words[i];
答案 1 :(得分:0)
Joseph,与其他编程语言(c#或PHP)不同,C语言的字符串处理功能非常基础。
您不能直接添加字符串,但是您可以使用许多库函数来完成相同的任务。
退房,
strtok - 用它将字符串拆分为单词。 strtok reference
strncat - 用于连接字符串
字符串只是以空字符结尾的字节数组(字节值为0)。
答案 2 :(得分:0)
这里更短/更干净
private char[] reverseWords(char[] words) {
int j = words.length - 1;
for (int i = 0; i < (words.length)/2; i++) {
if(i==j)
continue;
char temp = words[i];
words[i] = words[j];
words[j]=temp;
j--;
}
int lastIndex = 0;
for (int i=0;i<words.length;i++){
if(words[i]==' '){
words = reverseWord(words,lastIndex,i-1);
lastIndex=i+1;
}
}
words = reverseWord(words,lastIndex,words.length-1);
return words;
}
private char[] reverseWord(char[] words, int from, int to) {
int j=to;
for(int i=from;i<((to/2)+from/2);i++){
if(i==j) continue;
char temp = words[j];
words[j]=words[i];
words[i]=temp;
j--;
}
return words;
}