我虽然设置了一个名副其实的len
strlen()
函数来查找最后一个字符,然后将其打印,然后将其递减1.它在我的代码中不起作用:
#include <stdio.h>
#include <string.h>
#define SIZE 4
int main(void)
{
int index;
char wordToPrint[SIZE];
printf("please enter a random word:\n");
for (index = 0; index < SIZE; index++)
{
scanf("%c", &wordToPrint[index]);
}
int len = strlen(wordToPrint);
for (index = 0; index < SIZE; index++)
{
printf("%c", wordToPrint[len]);
--len;
}
return 0;
}
输入是“nir”
输出是:
??
r
最后一个街区出了什么问题?
TNX
答案 0 :(得分:5)
C数组从零开始索引。
考虑一下它如何影响字符串长度与最后一个字符的索引之间的关系。
另外,你在单词中阅读的方式很奇怪,它应该只是:
scanf("%s", wordToPrint);
或者,更好:
fgets(wordToPrint, sizeof wordToPrint, stdin);
不需要一次循环和读取一个角色。以上将根据输入量给出不同的长度。
第二个建议不会停留在空白处,所以如果你这样做,你可能应该用word
取代line
以便清楚。
答案 1 :(得分:2)
反向迭代需要偏移一个:
转发强>
for (size_t i = 0; i != N; ++i) { putchar(word[i]); }
<强>向后:强>
for (size_t i = 0; i != N; ++i) { putchar(word[N - i - 1]); }
// ^^^^
这是因为长度为N
的数组具有有效索引in the range [0, N)
。
答案 2 :(得分:2)
查看以下代码:
end = strlen(wordToPrint) - 1;
for (x = end; x >= 0; --x) {
printf("%c", wordToPrint[x]);
}
答案 3 :(得分:2)
除了其他海报所说的,你应该考虑给字符串提供额外的字节:
char wordToPrint[SIZE + 1];
然后设置
wordToPrint[4] = '\0';
如果有人输入一个4个字母的单词(例如&#39; blue&#39;),那么您的字符串将显示为{&#39; b&#39;,&#39; l&#39;,& #39;你&#39;&#39; e&#39;但是没有留空字符的空间。
Strlen和其他函数依赖于在最后找到一个空值。
答案 4 :(得分:1)
int len = strlen(wordToPrint);
for (index = 0; index < SIZE; index++)
{
printf("%c", wordToPrint[len]);
--len;
}
return 0;
假设你有单词otto
int len = strlen(wordToPrint);
会将len
设置为4,但是当您在printf("%c", wordToPrint[len]);
中使用它时,您的数组将超出绑定wordToPrint[4]
,其中数组中的最后一个索引为{{1}因为它从0索引开始
答案 5 :(得分:1)
写这样的代码是因为在wordToPrint [len],len是+1然后是wordToPrint []数组的最后一个索引,所以它显示了garbadge / null值
#include <stdio.h>
#include <string.h>
#define SIZE 4
int main(void)
{
int index;
char wordToPrint[SIZE];
printf("please enter a random word:\n");
for (index = 0; index < SIZE; index++)
{
scanf("%c", &wordToPrint[index]);
}
int len = strlen(wordToPrint);
for (index = 0; index < SIZE; index++)
{
--len;
printf("%c", wordToPrint[len-1]);
}
return 0;
}
答案 6 :(得分:1)
这是整个计划,针对您的问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strrev(char *); // Prototype
/* The following function is by me, to reverse a string, because strrev is not available in GCC */
char *strrev(char *str)
{
char *p1, *p2;
if (! str || ! *str)
return str;
for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
{
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
/*================================================================Begin Main======================================================================================*/
int main()
{
char sentence[100], rev_sentence[100], c;
int j = 0, i = 0, m = 0;
sentence[i] = ' '; // The first char in the sentence should be a space to reverse this first word
i++;
printf("Enter a sentence : ");
while((c = getchar()) != '\n')
{
sentence[i] = c;
i++;
}
sentence[i] = '\0';
printf("Reversed word is: ");
for(i = strlen(sentence) - 1 ; i >= 0; i = i - 1)
{
if(sentence[i] == ' ')
{
rev_sentence[j] = '\0'; // because strrev fun reverses string ntil it encounters a first \0 character
strrev(rev_sentence);
printf("%s ", rev_sentence);
for(m = 0; m < 100; m++)
rev_sentence[m] = 0;
j = 0;
continue;
}
rev_sentence[j] = sentence[i];
j++;
}
rev_sentence[j] = '\0';
}
这个程序会翻转整个句子,或者如果你只输入1个单词并按回车键,请按回车键,希望你喜欢它并理解它
答案 7 :(得分:0)
此代码错误:
int len = strlen(wordToPrint);
for (index = 0; index < SIZE; index++)
{
printf("%c", wordToPrint[len]);
--len;
}
它的打印字符从4到1,但你想打印3到0的字符。
你应该这样做:
for (index = len - 1; index >= 0; index--)
printf("%c", wordToPrint[index ]);
答案 8 :(得分:0)
除了其他答案之外,为什么在知道单词有SIZE字符时使用strlen()?
答案 9 :(得分:0)
以下是基于发布的代码的工作代码:
#include <stdio.h>
#include <string.h>
#define SIZE 4
int main(void)
{
int index;
char wordToPrint[SIZE];
printf("please enter a random word:\n");
//Why you need a loop to read a word?
//for (index = 0; index < SIZE; index++)
//{
// scanf("%c", &wordToPrint[index]);
//}
scanf("%s",wordToPrint);
int len = strlen(wordToPrint);
//Modify the loop like this:
for (index = len; index >= 0 ; index--)
{
printf("%c", wordToPrint[len]);
}
printf("\n");//Add this line for clearing the stdout buffer and a more readable output.
return 0;
}
注意:在使用它之前,对数组进行memset()或bzero()始终是一个好习惯。
答案 10 :(得分:0)
律&#39;为了好玩而破解:)
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 32
int main(void)
{
// allocate a zero-filled buffer of LENGTH bytes
// we add LENGTH so that we start writing right *after* the buffer
char *word = LENGTH + calloc(LENGTH, 1);
// 0xFF will limit our buffer so that we do not write out of bounds
*(word - LENGTH) = 0xFF;
// order is important: we are decrementing the pointer and **then**
// reading a character from the standard input, we compare it to the
// line feed character so that we stop reading characters when return
// key is pressed
while ((*--word = fgetc(stdin)) != '\n' && *word != 0xFF);
printf("The word is: %s", word);
// tidy up!
free(word);
return 0;
}
当然,这不会像预期的那样在&#34;现代&#34;系统,实现行缓冲控制台,而不是允许用户一次手动读取一个字符(虽然它可以使用特定于平台的API实现。)