我试图在一个给定的句子的单行打印每个单词。它工作得很好,但一个'_'出现在行尾。请帮助我,也适当manar写它。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {
char *s,i,check=0;
s = malloc(1024 * sizeof(char));
scanf("%[^\n]", s);
s = realloc(s, strlen(s) + 1);
for(i=0;i<1024;i++ ||check<=2)
{
if(*(s+i)!=' ')
{
printf("%c",*(s+i));
check=0;
}
else
{
printf("\n");
check++;
}
// fflush(stdin);
}
return 0;
}
输出:dkf fja fjlak d dkf fja fjlak d SER
输出2:-对于(i=0; i〈20;i++|| check〈=2)-你好我是苏拉杰·吉米尔你好我是苏拉杰·吉
3条答案
按热度按时间ddrv8njm1#
我不确定你的代码是否像你说的那样有效。
i
的类型不是char *
,所以应该是int。我建议稍微修改一下:
输出示例:
编辑:根据OP的要求,关于NULL终止字符的更多详细信息。
按照惯例,字符串(字符数组)以一个特定的字符结束,我们称之为NULL终止字符。这个字符是
0
,标志着字符串数据的结束。在你的例子中,存储字符串的缓冲区是动态分配的,如果你不检查字符串的NULL终止字符,那么你就继续处理数据,就好像它是字符串的一部分一样(实际上它不是)。
超过这个字符会使你访问以下的内存数据(这是你的程序RAM数据的一部分)。由于这些数据可以是任何值(从0到255),打印它们可能会导致"乱码",因为它们可能不能打印,而且肯定与你的字符串不一致。
在"最好"的情况下,程序会因为"分段错误"而停止,因为你正在访问一个你不允许访问的内存区域。在"最坏"的情况下,你在崩溃前打印了很多东西。
这通常被称为数据泄漏(无论是RAM还是ROM),因为它暴露了程序的内部数据。在您的示例的特定情况下,没有敏感数据。但是!想象一下您泄漏了存储在程序中的密码或私钥。这可能是一个严重的安全问题!
kq0g1dla2#
你的代码有几个问题。
首先,您需要检查
for
循环是否超出字符串的边界。您的
for
循环始终设置为true
,因为逻辑OR运算符||
的优先级高于逗号运算符。因此,循环将始终运行,除非使用break
停止最后,
check
在达到值2后永远不会重置为0。输出:
20jt8wwn3#
这里有两个问题。一个是字符串的长度不会总是1024,所以在打印字符串之前确定字符串的长度可能是好的。另一个是
check<=2
,它必须放在for循环的第二部分,所以测试将被评估。而且最好一次计算字符串的长度。所以我将字符串的长度存储在len
中。