程序写入字符串的首字母

时间:2015-01-12 19:10:14

标签: c string

我正在尝试创建一个程序,让用户输入他的名字,然后是中间名,每个名字后跟空格,如下例所示:

示例输入:标记棕色ashraf

示例输出: m b a

当我调试时遇到“访问冲突错误”

#include<stdio.h>
#include<conio.h>
#include<string.h>

int main(void)
{
    char name[100];
    int i=0;
    printf("Enter the name :");
    gets(name);
    while (name[i]!='\0')
    {
        if (name[i]==' ')
        {
            i++;
            printf("%c",name[i+1]);
        }
        i++;
    }
    getch();
}

“现在它不给我第一个首字母,但打印其余的首字母”

2 个答案:

答案 0 :(得分:4)

发生访问冲突,因为您在printf电话中使用了错误的格式说明符。

printf("%s", name[i+1]);

应该是

printf("%c", name[i+1]);

或者甚至更直接:

putchar(name[i+1]);

发生违规,因为%s需要一个指针,然后打印功能会解除引用。您传递的char值不是有效的内存地址。

请打开编译器警告。他们通常可以告诉您,您的格式字符串与参数不匹配。

修改除了访问冲突外,您的程序还有更多问题:

  • 在空格后增加i两次,以便实际打印每个单词的第二个字母。 (如果你的输入是&#34;甚至是一个空间; Taylor C Huckleberry&#34;)。
  • 除非你的输入以空格字符开头,否则你不会抓住第一个单词。
  • 当您的输入有尾随空格时,您最终可能会打印'\0'字符。
  • 如果您的输入有后续空格,则可以打印其他空格。

还有一些正式的编程错误:

  • main应该返回int,但您的代码永远不会。
  • 您使用过时的gets,它已被更安全的fgets取代。 (不幸的是,fgets会保留一个尾随换行符,但这对您的代码来说并不重要。)

在我看来,更好的方法是跟踪先前读取的字符并仅在前一个字符是空格且当前字符是字母时才打印初始字符。标题<ctype.h>提供了便捷的函数isspaceisalpha来检查这一点。先前读取的字符以空格字符开头,因此您可以抓住第一个单词:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
    char name[100];
    char prev = ' ';        /* pretend there's a space before the string */
    int n = 0;              /* number of initials printed */
    int i = 0;

    printf("Enter the name: ");
    fgets(name, sizeof(name), stdin);

    while (name[i]!='\0') {
        if (isalpha(name[i]) && isspace(prev)) {
            if (n++) putchar(' ');
            putchar(name[i]);
        }
        prev = name[i];
        i++;
    }
    putchar('\n');

    return 0;
}

答案 1 :(得分:1)

while (name[i]!='\0')
{
    if (name[i]==' ')
    {
        i++;
        printf("%s",name[i+1]);
    }
    i++;
}

如果您在循环内两次递增i,则可能会使访问数组超出范围。这是一个潜在的错误。

gets()不再是标准,您应该使用fgets()代替处理缓冲区溢出。