Zah*_*hid 1 c arrays string io output
我正在尝试反转字符串。scanf 运行良好,但是当我使用固定字符串时,它会给出垃圾值。那么问题出在哪里呢?
#include<stdio.h>
#include<string.h>
int main()
{
char s[50]="Hi I Love Programming";
char rev[strlen(s)];
int i,k;
k=strlen(s);
for(i=0; i<strlen(s); i++)
{
rev[k]=s[i];
k--;
}
printf("The reverse string is: %s\n", rev);
}
Run Code Online (Sandbox Code Playgroud)
你的程序有两个问题:
\nchar rev[strlen(s)];\nRun Code Online (Sandbox Code Playgroud)\n您忘记为字符串终止空字符添加元素\'\\0\'。
使用:
\nchar rev[strlen(s) + 1];\nRun Code Online (Sandbox Code Playgroud)\n此外,您还忘记在反转字符串的末尾附加此字符。
\n使用:
\nsize_t len = strlen(s);\nrev[len] = \'\\0\';\nRun Code Online (Sandbox Code Playgroud)\n请注意,我的len是k您提供的代码中的。我使用标识符是len因为该对象的意图更加明显。您可以使用strlen(s),因为字符串具有相同的长度,无论方向正确还是相反,\xc2\xb4 都无关紧要。
k=strlen(s);\n\nfor(i=0; i<strlen(s); i++)\n{\n rev[k]=s[i];\n k--;\n}\nRun Code Online (Sandbox Code Playgroud)\n当rev[k]您访问数组之外的内存时rev,因为索引计数从 开始0,而不是1。因此,行为是未定义的。
k需要是strlen(s) - 1。
需要注意三点:
\n的返回值strlen()是 类型size_t,因此 类型的对象size_t适合存储字符串长度,而不是int。
更有效的是计算一次字符串长度,而不是在每个条件测试中计算一次。使用第二个对象来存储字符串长度并在循环条件中使用该对象for,例如i < len2.
char s[50]="Hi I Love Programming";可以简化为char s[]="Hi I Love Programming";- 编译器自动检测存储字符串+终止空字符所需的元素数量。这既节省了不必要的内存空间,又确保分配的空间足以容纳带有空字符的字符串。
代码还可以简化(网上例子):
\n#include <stdio.h>\n#include <string.h>\n\nint main(void)\n{\n char s[] = "Hi I Love Programming";\n size_t len = strlen(s);\n\n char rev[len + 1];\n size_t i,j;\n\n for(i = 0, j = (len - 1); i < len; i++, j--)\n {\n rev[j] = s[i];\n }\n\n rev[len] = \'\\0\';\n\n printf("The reverse string is: %s\\n", rev);\n}\nRun Code Online (Sandbox Code Playgroud)\n输出:
\nThe reverse string is: pgnimmargorP evoL I iH\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |