繁体   English   中英

删除字符串中的空格

[英]Removing spaces in a string

我试图在扫描后删除字符串的空格。 该程序已完美编译,但未显示任何输出,并且在扫描字符串之后,输出屏幕只会不断关闭。 我的编译器是否存在逻辑错误或有问题(我正在使用devc ++编译器btw)。 任何帮助将不胜感激

int main()
{
    char str1[100];
    scanf("%s",&str1);
    int len = strlen(str1);
    int m;
    for (m=0;m<=len;){
        if (&str1[m]==" "){
            m++;
        }
        else {
            printf("%c",&str1[m]);
        }
        m++;
    }
    return 0;
}

编辑:对不起m = 1的错误,我只是在检查我的编译器是否有效,只是碰巧粘贴了该代码

您的代码包含很多问题,您描述的行为很可能不是由于编译器中的错误引起的:-)

一些问题:

使用scanf("%s",str1)代替scanf("%s",&str1) 由于str1被定义为字符数组,因此它会根据需要自动衰减为char的指针。

请注意, scanf("%s",str1)永远不会在任何空白中读取,因为"%s"被定义为跳过前导空白并且在检测到第一个空白时停止读入。

for (m=1;m<=len;)str1[m]一起使用时,请注意,C中的数组使用基于零的索引,即str1[0]..str1[len-1] ,使得m <= len超出数组范围。 for (m=0;m<len;)

从类型的角度来看,表达式&str1[m]==" "是正确的,但从语义上讲是胡说八道。 您正在将第m个字符的内存地址与字符串文字" "的内存地址进行比较。 请使用str1[m]==' '代替,并注意单引号表示字符值,而不是双引号表示字符串文字。

语句printf("%c",&str1[m])将字符的内存地址传递给printf而不是预期的字符值本身。 使用printf("%c",str1[m])代替。

希望我能找到一切。 更正这些问题,打开编译器警告,然后尝试解决问题。 万一您遇到进一步的麻烦,请随时询问。

希望它对体验C语言有所帮助:-)

有很多问题:

  1. 您不能使用scanf("%s")读取带空格的字符串,而应使用fgets (请参见注释)。
  2. scanf("%s", &str1)还是错误的,应该是scanf("%s", str1); str1已经是字符串的地址
  3. for (m = 0; m <= len;)是错误的,应该是for (m = 0; m < len;) ,因为否则,您要检查的最后一个字符是NUL字符串终止符。
  4. if (&str1[m]==" ")错误,则应编写if (str1[m]==' ')" "不表示空格,而是字符串文字,而需要' '
  5. printf("%c", &str1[m]); 是错误的,您要打印一个char因此需要str1[m] (不带& )。
  6. 您应该同时删除两个m++并将其放入for语句中: for (m = 1; m < len; m++) ,这使代码更清晰。

可能还有其他一些问题。

顺便说一句,您的尝试不会从字符串中删除空格,而只会显示字符串跳过空格。

这里汇总了许多较小的错误。

首先,检查for循环的边界。 您正在从索引1迭代到索引strlen(str1) (包括)。 尝试这样做是合理的,但是请记住,在C中,字符串索引从0开始,一直上升到strlen(str1) (包括)。 您如何调整循环以处理此问题?

其次,看一下这一行:

if (&str1[m] == " ") {

在这里,您尝试检查给定字符是否为空格字符。 但是,这并没有达到您的预期。 该表达式的左侧&str1[m]是字符串str1的第m个字符的内存地址。 那应该使您稍稍停顿一下,因为如果您要比较给定位置处的内存内容 ,则不应查看该内存位置的地址 实际上,这行代码的真正含义是“如果数组中字符m的地址等于包含空字符串的字符串文字的地址,则...”,这不是您想要的。

我怀疑您可能首先开始写以下代码:

if (str1[m] == " ") {

这更接近您想要的,但仍然不太正确。 在这里,表达式的左侧正确显示为“ str1的第m个字符”,其类型为char 但是,右侧是字符串文字。 在C语言中,字符(单个字形)和字符串(字符序列)之间存在差异,因此不允许进行这种比较。 要解决此问题,请将行更改为

if (str1[m] == ' ') {

在这里,通过使用单引号而不是双引号,将右侧视为“空格字符”,而不是“包含空格的字符串”。 类型现在匹配。

有关此代码的其他一些细节需要清除。 例如,查看如何打印每个字符。 这是将printf与字符配合使用的正确方法吗? 考虑一下我们上面讨论的if语句,看看是否可以修改代码。 同样,查看您如何读取字符串。 到处可能存在更多的小问题,但是其中大多数是这些现有主题的变体。

但是我希望这可以帮助您朝正确的方向前进!

For循环应从0开始且小于长度(不小于或等于)

字符串比较是错误的。 应该是char与''比较,否&

寻找空间不应该做任何事,非空间输出。 你++ m两次。

&在%c上输出的是地址而不是值

从内存中,scanf总是在空白上停止,因此需要fgets

    int main()
{
    char str1[100];
    scanf("%s",str1);
    int len = strlen(str1);
    int m;
    for (m=0;m<len;++m){
        if (str1[m]!=' '){
            printf("%c",str1[m]);
        }

    }
    return 0;
}

您的逻辑中很少有错误。

  • scanf在遇到任何spacenew line终止字符串。 在此处了解更多信息。 因此,请使用其他人所说的fgets

  • C &代表地址。 由于数组在C作为指针实现,因此不建议在从stdin获取字符串时使用& 但是scanf可以像scanf("%s",str1)scanf("%s",&str[1])

  • 在增加索引时,将m++放入else条件中。

  • C数组索引从0而不是1开始。

因此,在这些更改之后,代码将变成类似

int main()
{
    char str1[100];
    fgets(str1, sizeof str1 , stdin);
    int len = strlen(str1);
    int m=0;
    while(m < len){
        if (str1[m] == ' '){
            m++;
        }
        else {
            printf("%c",str1[m]);
            m++;
        }

    }
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM