Jak naprawić błędy kompilacji, które wspominają o „stray” \ 342 ”i„ stray ”\ 200”? [Zamknięte]

9

Napisałem ten program:

#include<stdio.h>
int main()
{
printf(“Hello World\n”);
return 0;
}

Zapisałem go jako first.ci próbowałem skompilować, ale otrzymując ten problem, zainstalowałem nawet kompilator gcc.

$ gcc first.c -o first1
first.c: In function ‘main’:
first.c:4:1: error: stray ‘\342’ in program
first.c:4:1: error: stray ‘\200’ in program
first.c:4:1: error: stray ‘\234’ in program
first.c:4:11: error: ‘Hello’ undeclared (first use in this function)
first.c:4:11: note: each undeclared identifier is reported only once for each function 
it appears in
first.c:4:17: error: expected ‘)’ before ‘World’
first.c:4:17: error: stray ‘\’ in program
first.c:4:17: error: stray ‘\342’ in program
first.c:4:17: error: stray ‘\200’ in program
first.c:4:17: error: stray ‘\235’ in program

Jak mogę rozwiązać ten problem?

Zahid
źródło
Czy skopiowałeś ten program z innego edytora tekstu lub dokumentu, takiego jak Libre office lub Microsoft Word?
jobin
jeśli skądś skopiowałeś kod, przepisz go samodzielnie, ponieważ w skopiowanym kodzie mogą znajdować się niechciane kody.

Odpowiedzi:

13

Problem polega na tym, że zamiast cudzysłowów ASCII masz znaki Unicode; prawdopodobnie twój edytor automatycznie je zmienił lub skopiowałeś tekst ze strony, która robi to automatycznie w swoim oprogramowaniu do tworzenia treści. Zamień cytaty na zwykły cytat ASCII (0x22, ”) i powinno działać.

Naprawiono źródło:

#include <stdio.h>
int main()
{
    printf("Hello World\n");
    return 0;
}
Krzysztof Kosiński
źródło
+1 Zastanawiałem się, skąd ma te cytaty tam / z powrotem.
Aaron
Znaki cudzysłowu Unicode vs. ASCII mogą nie być najlepszym sposobem na określenie rozróżnienia, ponieważ poprawne znaki cudzysłowu dla ciągów w C ( ") są również znakami Unicode. (Są to również znaki ASCII, ale za każdym razem, gdy ktoś wybiera między nimi, ich plik jest prawdopodobnie zapisywany w jakimś formacie Unicode. W systemie uniksowym, zwykle UTF-8.)
Eliah Kagan
inne podstępne postacie są zamiast -.
Trevor Boyd Smith
2

Otaczasz swój ciąg niewłaściwymi cytatami.

Ty masz:

Hello World\n

Zamiast tego powinieneś mieć:

"Hello World\n"

Chociaż użyte cytaty wyglądają podobnie, nie są one rozpoznawane przez kompilator C jako zawierające ciąg. W ten sposób otrzymujesz komunikaty o błędach dotyczące nierozpoznanych znaków Unicode i otrzymujesz komunikaty o błędach wskazujące, że treść ciągu jest interpretowana jako niecytowany kod programu.

Zauważysz, że użyte cytaty mają oddzielne znaki na początku i na końcu cytatu (są zakrzywione tak, jak często cytaty są składane). Wiele edytorów tekstu - jak sugerował Jobin - automatycznie zamienia proste "cytaty w tak fantazyjne cudzysłowy. Jeśli używasz edytora tekstu do tworzenia programów w C, powinieneś użyć edytora tekstu.

Ubuntu jest geditdomyślnie instalowany (chociaż jest też wiele innych edytorów tekstu do wyboru). Podobnie jak wiele edytorów tekstu, geditzapewnia podświetlanie składni dla wielu języków programowania, w tym C (więc inny tekst w twoim programie będzie wyświetlany w różnych kolorach, aby oznaczać jego znaczenie), co jest przydatną funkcją i sprawia, że ​​edytor tekstu jest o wiele wygodniejszy i przyjazny dla użytkownika programowanie niż edytor tekstu.

Może to być specyficzne dla Ubuntu, jeśli przyzwyczaiłeś się do edytora tekstu na innej platformie, który automatycznie redukuje wklejone znaki cudzysłowu do wersji innej niż fantazyjna. Ale to pytanie może zostać zamknięte i migrowane do Przepełnienia stosu .

Eliah Kagan
źródło
problem rozwiązany.my program is compiled.tanx alot
Zahid
1

Możesz użyć sedpolecenia, aby rozwiązać te problemy.

To da ci szybki podgląd tego, co zostanie zastąpione.

sed -re 's/”|“/"/g' File.txt

Spowoduje to zastąpienie i umieszczenie zastąpienia w nowym pliku o nazwie WithoutSmartQuotes.txt:

sed -re 's/”|“/"/g' File.txt > WithoutSmartQuotes.txt

Spowoduje to zastąpienie oryginalnego pliku:

sed -i .bk -re 's/”|“/"/g' File.txt
Cokedude
źródło